awk은 레코드(기본은 라인) 단위로 입력받아 패턴(정규식) 검색으로 일치하는 라인을 받아 처리한다. 패턴 매칭과 처리는 작은따옴표로 묶고 처리는 중괄호로 묶어서 사용한다.
$ awk 'pattern {action}' filename
입력으로부터 pattern으로 필터링 후 action을 수행한다. pattern이 없으면 전부 action을 수행하고, action이 없으면 입력받은 레코드를 그대로 출력한다. filename이 없는 경우는 stdin을 입력으로 받는다.
action에서는 프로그래밍 언어답게 기본으로 지원되는 내장 변수들이 많다.
내장 변수
$n
$0
은 레코드, $1
부터는 separator 나뉜 필드가 할당된다. separator는 아래 있는 FS값이고 변경할 수 있다.
NR
NR은 pattern으로 필터링하기 전에 원래 인풋의 레코드 숫자로 1부터 증가한다.
FS
필드를 구분하는 separator로 기본값은 공백이다. -F '\t'
와 같이 -F 옵션으로 바꿀 수 있다.
RS
레코드을 구분하는 separator로 기본값은 newline이다. -v RS='"'
와 같이 -v 옵션으로 바꿀 수 있다.
BEGIN / END
첫 번째 라인을 읽기 전과 마지막 라인을 읽은 후에 처리할 action을 정의할 수 있다. 모든 처리를 끝낸 후에야 알 수 있는 값을 넘길 때 사용한다.
ex)
$ awk '{ sum += $1 } END { print sum }'
내장 함수
exp, log, sqrt, sin, cos, atan2, rnad 같은 수학 함수뿐만 아니라 간단한 문자열 처리 함수(substr, index, split, tolower)도 있다.
sub(regex, substitutes, string)
string에서 처음 regex와 첫 번째로 매칭 되는 부분을 찾아 substitues로 치환한다. 함수의 리턴 값은 gsub과 마찬가지로 치환된 개수이다. 따라서 치환된 값을 출력하려면 따로 print를 추가해야 한다.
gsub(regex, substitutes, string)
sub와 똑같지만 매칭 되는 전체를 치환한다.
참고
int
기본 변수가 정수형이 아니라서 나눗셈 연산할 때 주의해야 한다.
예를 들어 access log에서 9번째 필드인 http code가 4xx인 로그를 찾으려면 int로 형 변환을 해주어야 한다.
ex)
$ awk 'int($9 / 100) == 4'
default action
print의 기본값이 $0
이라서 생략할 경우 해당 레코드가 출력된다. 이것과 마찬가지로 awk의 default action은 입력받은 레코드를 그대로 출력하는 print $0
이라서 생략할 경우 해당 레코드가 출력된다. 이를 활용하면 action 자리에 1이라는 true condition을 넘김으로써 이 역할을 대신할 수 있다.
ex)
$ awk '{ gsub("a", "b") } { print $0 }'
$ awk '{ gsub("a", "b"); print $0 }'
$ awk '{ gsub("a", "b"); print }'
$ awk '{ gsub("a", "b") } 1'
'기타' 카테고리의 다른 글
[bash] 간단한 부하테스트 script (0) | 2019.12.12 |
---|---|
[bash] sed 사용 설명서 (0) | 2019.12.01 |
삭제된 라인의 git commit 찾기 (0) | 2019.11.20 |
RFC1918과 CIDR 블록 (0) | 2019.10.24 |
jq로 JSON 처리하기 (0) | 2019.10.23 |
댓글