서론

Unix 계열 운영체제에서는 Windows와 다르게 Unix 쉘을 사용하여 대부분의 일을 처리하게 된다.
Unix shell은 여러가지 강력한 기능들을 제공하는데 그 기능들 중 하나는 Pipeline이다. Pipeline은 간단하게 말하면 명령어의 출력을 다음 명령어의 입력이 되게 하는 것이고 정확하게 말하면 프로그램의 standard output을 다음 명령어의 standard input이 되게 하는 것이다(stdin, stdout을 close하고 dup하여 pipe통신을 하게한다고 이해하면 편하다). 이렇게 하면 다양한 명령어의 조합으로 수많은 기능을 구현할 수 있게 된다.
이 Pipelining이라는 기능과 함께 자주 쓰이는 명령어가 하나 있는데 바로 awk이다.

AWK란?

awk의 역할은 pattern 확인을 하고 해당 패턴에 매칭되는 문자들을 처리하는 유틸리티이다. 여러가지 강력한 텍스트처리 능력을 가지고 있는데 그 기능들 중에는 문자열을 특정 문자로 나누고 문자열을 변수에 저장하고 원하는 방법으로 출력하는 등의 기능을 가지고 있다. awk의 기능은 너무 많기 때문에 자주 사용되는 기능만 정리하고자 한다. 더 많은 기능을 확인하고 싶으면 맨 하단 문서를 확인하면 된다.

AWK의 처리 순서

awk는 문자열을 1. 한 줄 씩 읽고 2. 패턴에 맞게 문자열을 추출한 후 3. 처리하게 된다. awk는 다음과 같은 형태를 띈다.

awk '/pattern/ {<awk_commands>}'

위 명령어는 문자열을 한 줄 씩 읽고 pattern에 맞게 추출한 후, awk_commands로 처리하게 된다.
awk를 사용하다 보면 전체 라인의 숫자를 추출하고 평균을 내고 싶을 경우가 있다. 이러한 기능을 구현하기 위해서는 맨 처음 또는 맨 끝에 한번만 실행되는 명령이 필요한데 이 때 BEGINEND를 사용한다.
사용할 땐 다음과 같이 사용한다.

awk 'BEGIN {<awk_commands>}'
awk 'END {<awk_commands>}'

위 내용을 모두 합치면 다음과 같다.

awk 'BEGIN {<awk_commands>} /pattern/ {<awk_commands>} END {<awk_commands>}'

이제 어느정도 형태를 알았으니 pattern에 대해 알아보자.

AWK의 패턴

awk에서 패턴을 지정하지 않으면 한 라인 전체를 의미한다. 이 경우를 제외하고 패턴은 크게 3가지로 나뉜다.

  • /regex/
  • expression
  • pat1, pat2

/regex/

regex는 정규식 표현이다. 우리가 일반적으로 사용하는 정규식의 표현을 따른다. 해당 정규식 표현식에 만족하는 패턴에 맞는 줄에 대해 awk_commands를 실행시킨다.

expression

여러가지 built-in function과 비교문을 사용할 수 있다. 예를 들어 다음과 같이 사용한다.

awk '$1 == "foo" { print $2 } '
awk '" { print $2 } '

pat1, pat2

range를 지정할 수 있게 된다. pat1을 만족할 경우부터 pat2를 만족할 때까지 한 줄 씩 처리한다.
다음 예시를 보면 쉽게 알 수 있다.

1 AAA
2 BBB
3 CCC
4 DDD
5 EEE
6 FFF

위 문자열에서 번호가 3부터 5까지 처리하게 하고 싶다고 하자. 그러면 다음과 같이 하면된다.

... | awk '$1==3,$1==5{<awk_commands>}'

pat1을 만족하면 프로세싱을 시작하고 pat2를 만족하면 그 다음부터 프로세싱을 멈추게 된다.

AWK의 기능

awk의 기능은 너무 많아서 포스팅에 담기엔 부적절한 것같다. 필요할 때 마다 필요한 부분을 보는 것을 추천한다.

스플릿

awk는 기본적으로 공백을 기준으로 문자열을 분리한다. 분리한 문자열은 $1 ~ $n까지 분리되어 저장된다.

문자열 출력

c 계열 언어의 printf 함수와 매우 유사하다. 단지 괄호가 없는 것 뿐이다.

변수, 배열

awk는 변수, 배열을 지원하고 심지어 argc, argv, 환경변수에도 접근 가능한다.

반복문, 분기문

일반적인 프로그래밍 언어 문법고 매우 유사하다.

굉장히 성의없어 보이지만 문서를 보고나면 바로 쓸 수 있을 정도로 쉽기 때문에 필요할 때 마다 문서를 보는 걸 추천한다.


Reference