출처: http://ra2kstar.tistory.com
unix나 linux 를 사용하면서 많이 쓰게 되는 awk에 대해서 공부해 본다. 사실... 쉘 스크립트를 자주 보게 되는데 awk 문법이 자주 보여서 공부해야 할 필요성을 느꼈다.
awk
awk 는 필드 단위로 패턴을 검색하고, 조작하는 것을 주 목적으로 한다. 파일 내의 각 라인 (레코드)에 대한 필드 를 인식할 수 있는 패턴 검색 기능을 보유하고 있으며, 이를 이용해서 조작도 가능하다.
awk [-f 프로그램파일] [-F 필드구분자] ["패턴{액션}"] [처리할 파일명]
옵션
-f 프로그램 파일
awk 유틸리티의 실행 액션이 저장된 프로그램 파일을 지정
-F 필드 구분자
필드 구분자를 지정
"패턴{액션}"
패턴이 일치하면 액션이 실행된다.
사용예
$> awk -F : "{print $1, $6}" ./text.txt
= text.txt 파일에서 ":" 구부자를 이용하여 1번째와 6번째 필드를 프린트
패턴과 액션의 구조
awk의 옵션 중의 하나였던 ["패턴{액션}"] 에서도 여러가지 구조가 존재한다. 가장 대표적인 3가지를 알아보자
1. BEGIN
- 첫번째 레코드를 읽기 전에 지정된 액션을 실행
2. END
- 마지막 레코드를 읽고 난 후, 지정된 액션을 실행
3. PATTERN
- 입력되는 각 라인(레코드)별로 실행되며, 만약 그 라인이 패턴과 일치할 경우 액션이 실행된다.
- 정규표현식의 경우 "/정규식/" 으로 나타낸다.
- 패턴만 있는 경우 : 패턴과 일치하는 라인을 화면에 출력한다.
- 액션만 있는경우 : 모든 라인이 액션의 대상이 된다.
awk 시스템 변수
awk가 내부적으로 인식하는 변수들이다. 이것을 이용하면 조금 더 효율적으로 사용 할 수 있다.
변수명 | 내용 |
FILENAME | 현재 처리중인 파일명 |
FS | 필드 구분자로 디폴트는 공백 |
RS | 레코드 구분자로 디폴트는 새로운 라인 |
NF | 현재 레코드의 필드 개수 |
NR | 현재 레코드의 번호 |
OFS | 출력할 때 사용하는 FS |
ORS | 출력할 때 사용하는 RS |
$0 | 입력 레코드의 전체 |
$n | 입력 레코드의 n번째 필드 |
awk 사용 예
awk "{print FILENAME}" test.txt
= test.txt 파일의 레코드 개수만큼 파일이름을 출력한다.
awk "{print NR}" test.txt
= test.txt 파일의 레코드 번호를 출력한다.
awk 'BEGIN {FS="\t"} {print $1 , $2}' test.txt
= test.txt 파일의 필드 구분자를 "\t" 으로 지정하고, 1번째와 2번째 필드를 프린트 한다.
awk 'BEGIN {FS="\t"; OFS ="-"} {print $1 , $2} END {print "총 레코드의 수 : " NR}' test.txt
= test.txt 파일의 필드 구분자를 "\t" 로 지정하고, 1번째와 2번째 필드를 프린트 하되, 필드 구분자를 "-"
로 바꾸어 출력하고, 모든 레코드가 끝난 뒤, 총 레코드의 수를 출력한다.
결과화면