2022-05-09 awk_정리

awk

Aho, Weinberger, Kernighan 3명의 개발자 이름에서 첫 글자를 따왔다.

주로 오크라고 발음한다.

유닉스에서 개발된 스크립트 언어다.

원본 문서에서 패턴을 검사해 원하는 값을 얻는다.

각 줄(line)은 레코드(Record), 단어들을 **필드(Field)**라고 부른다.

기본적으로 레코드는 줄 바꿈으로 구부하고 필드는 공백으로 구분한다.

참고로 필드구분자를 변경할 수 있는 방법도 있다.

옵션설명
-F확장된 정규 표현식으로 필드구분자를 지정한다. 다중 필드 구분자 사용이 가능하다.
awk -F단일로 사용시 :를 필드구분자로 인식
awk -F'[:\t]’다중 필드 구분자 :\t(=tab)을 필드구분자로 인식

awk의 기본 사용법

**패턴(pattern)**과 **액션(action)**을 정의하여 입력으로 주어진 파일의 데이터를 가공하여 출력합니다.

awk 'pattern' filename

awk '{ action }' filename

awk 'pattern { action }' filename
Code language: JavaScript (javascript)

출처 : https://muabow.tistory.com/entry/awk [이름 같은게 중요 한가요]

 

예시 파일

name    phone           age
kim     010-1234-1231   20
lee     010-1234-1232   30
bak     010-1234-1233   40
sung    010-1234-1234   50
jo      010-1234-1235   60

패턴만 사용

# 다음의 awk 명령은 kim라는 문자열 패턴이 포함된 레코드를 출력해주는 명령입니다.
awk '/kim/' ./test_file.txt
Code language: PHP (php)

액션만 사용

awk '{ print $1 }' ./test_file.txt   # 각 라인의 첫 번째 필드만 출력
awk '{ print $1,$2 }' ./test_file.txt # 각 라인의 첫 번째, 두 번째 필드 출력
Code language: PHP (php)

패턴과 액션 사용

awk '/kim/ { print $2 }' ./test_file.txt
Code language: JavaScript (javascript)

패턴은 라인을, 액션은 필드을 선택할 수 있다.


awk 응용

print

awk '{ print ("name : " $1 ", "  "phone : " $2) }' ./test_file.txt
Code language: JavaScript (javascript)

if 구문

awk '{ if ( $3 >= 40 ) print ($0) }' ./test_file.txt

# 또는

awk '$3 >= 40 { print $0 }' ./test_file.txt
Code language: PHP (php)
awk '{ if ( $1 == "jo" ) print ($0); else print ( "noting" ); }' ./test_file.txt

noting
noting
noting
noting
noting
jo    010-1234-1235    60
Code language: JavaScript (javascript)
awk '{ if ( $3 >= 40 && $1 == "jo" ) print ($0) }' ./test_file.txt

awk '{ if ( $3 >= 40 || $1 == "jo" ) print ($0) }' ./test_file.txt
Code language: JavaScript (javascript)

for 구문

awk '{ for(i=0;i<2;i++) print( "for loop :" i "\t" $1, $2, $3) }' ./test_file.txt
Code language: JavaScript (javascript)
for loop :0    name phone age
for loop :1    name phone age
for loop :0    kim 010-1234-1231 20
for loop :1    kim 010-1234-1231 20
for loop :0    lee 010-1234-1232 30
for loop :1    lee 010-1234-1232 30
for loop :0    bak 010-1234-1233 40
for loop :1    bak 010-1234-1233 40
for loop :0    sung 010-1234-1234 50
for loop :1    sung 010-1234-1234 50
for loop :0    jo 010-1234-1235 60
for loop :1    jo 010-1234-1235 60

# awk가 작동하는 방식을 알 수 있음.
# awk는 첫 레코드부터 마지막 레코드까지 작업을 반복 수행한다.
Code language: CSS (css)

내장 함수

awk '{ print ("name leng : " length($1), "substr(0,3) : " substr($1,0,3)) }' ./test_file.txt
Code language: JavaScript (javascript)

length() : 단어의 길이

substr(a, b) : a~b까지의 글자 추출

toupper : 대문자로 출력

tolower : 소문자로 출력

… 더 필요한 것이 있으면 구글에 검색해보자.

변수 사용

awk도 하나의 프로그래밍 언어다.

때문에 변수를 사용할 수 있다.

아래는 awk에 기본적으로 내장된 변수들이다.

내장 변수설명
FILENAME현재 입력파일의 이름
$0입력 레코드
$n입력 레코드의 N번째 필드
ENVIRON환경변수를 모아둔 관계형 배열
NR출력 순번
NF현재 줄의 필드수
ARGC명령줄의 인자들의 개수
ARGV명령줄의 인자들의 배열
FNR현재 파일에서의 레코드 번호
FS입력 필드 구분자
OFMT숫자들의 표현형식
OFS출력 필드 구분자
ORS출력 레코드 구분자
RS입력코드 구분자
EP서브스크립트의 구분자
RLENGTHmatch 함수로 일치하는 문자열의 길이
RSTARTmatch 함수로 일치하는 문자열의 오프셋

BEGIN, END pattern

awk 'BEGIN { sum = 0 cnt = -1 } { sum += $5 cnt++ } END { avg = sum/cnt print ("sum :" sum ", average :" avg) }' ./test_file.txt
Code language: JavaScript (javascript)
awk '
BEGIN {
sum = 0
cnt = -1
}

{
sum += $5
cnt++
}

END {
avg = sum/cnt
print ("sum :" sum ", average :" avg)
}' ./test_file.txt
Code language: PHP (php)

BEGIN은 모든 레코드를 돌기 전에 한번 action을 수행

중간 부분은 첫 번째 레코드에서 마지막 레코드까지 반복해서 실행된다.

END는 모든 레코드를 다 돈 후에 마지막으로 정의한 action이 실행

(name phone age가 존재하기 때문에 cnt = -1로 초기화.)


참고

출처 : https://reakwon.tistory.com/163

출처 : https://muabow.tistory.com/entry/awk

특히 아래의 포스팅은 awk의 거의 모든 것을 정리되어있다!

linux awk 사용법과 예제 설명

https://muabow.tistory.com/entry/awk


댓글 남기기