awk 동작 원리



1) 먼저 awk는 파일 또는 파이프를 통해 입력 라인을 얻어와서 $0 이라는 내부 변수에 라인을 입력해 둔다. 각 라인은 레코드라고 부르는데, 기본적으로 newline에 의해 구분된다.

2) 다음으로 라인은 공백을 기준으로 각각의 필드나 단어로 나누어진다. 각 필드는 번호가 매겨진 변수로 저장되고 $1 부터 시작한다. 많게는 100개 이상의 필드를 저장할 수 도 있다. 

3) awk가 어떻게 공백을 사용하여 필드를 나눌까? 내장 변수인 FS라고 부르는 필드 분리자가 있는데, 이 FS는 가장 먼저 공백(탭)을 할당받는다. 만약 필드가 콜론(:) 이나 대시(-) 와 같은 다른 문자에 의해 분리된다면 새로운 필드 분리자로 FS의 값을 변경할 수 있다.

4) awk는 화면에 필드를 출력할 때 print 함수를 사용한다.

위의 결과값으로 CentOS와 100사이에 공백이 들어가 있음을 확인할 수 있다. 왜냐하면 명령에서 콤마(.)가 들어가 있기 때문이다. 콤마는 출력필드 분리자(OFS) 라는 내장 변수와 매핑되어 있다. 이 OFS는 기본값으로 공백을 할당받는다. 그래서 콤마는 OFS 변수에 할당된 공백 문자를 만들게 되는 것이다.

5) awk가 화면에 출력을 하고 나면 파일의 다음 라인이 호출되고 $0으로 저장된다. 이때 앞에서 변수 $0에 저장되었던 라인은 덮어쓰기가 된다. 또 다시 공백을 기준으로 필드가 분리되고 처리가 진행된다. 이와 같은 프로세스는 파일의 모든 라인이 처리되기 전까지 계속 반복된다.



print 함수

awk 명령의 액션 파트는 중괄호({})로 묶어준다. 만약 액션이 지정되지 않고 패턴이 매칭된다면 awk는 매칭된 라인을 모니터에 출력하는 기본 액션을 수행한다.

print함수는 포매팅이 필요없이 간단히 출력하는데 사용된다. 좀더 복잡한 포매팅을 원한다면 printf, fprintf, sprintf 함수를 사용하도록 한다. 


print 함수는 {print} 형식으로 awk의 액션 부분에 사용될 수 있다. 

print 함수는 아규먼트로 변수와 계산된 값 또는 문자열 상수를 받는다. 문자열은 큰 따옴표("")로 둘어싸야 한다. 

콤마(,)는 아규먼트들을 분리하는데 사용된다. 만약 콤마를 사용하지 않으면 아규먼뜰은 서로 연결되어버린다. 콤마는 기본값으로 공백을 가지는 OFS의 값을 검사한다.


print 함수의 이스케이프 문자

\b        백스페이스   

\f        폼피드

\n        newline 

\r        캐리지 리턴

\t        탭

\047        8진수 47

\c        c는 문자를 대표한다.



OFMT 변수

숫자를 출력할 때 숫자의 포맷을 제어해야 할 경우가 있다. 간단히 printf 함수를 사용하면 되지만, OFMT(Output Format) 변수를 사용할 수도 있다. 

OFMT 변수는 print 함수를 사용할 때 숫자의 출력 포맷을 제어할 수 있다. 기본 포맷으로 %.6g 가 설정된다. 이 포맷은 최대 전체 6자리를 가지는데, "0." 으로 시작하면 소수점 아래 6자리를 출력하고, "0."이 아닌 수로 시작하면 전체 6자리를 출력한다. 그리고 소수점 아래에 위치하는 마지막 6번째 수는 7번째 자릿수에서 반올림한다. 만약 대상의 수가 6자리를 넘지 않으면 그대로 출력한다.





printf 함수

출력할 때 필드 사이에 공백들을 지정하고 싶을 경우가 있다. 탭키를 사용한 print 함수는 깔끔한 출력을 보장하지 못한다. 하지만,

printf 함수는 포매팅된 깔끔한 출력을 제공한다. 

printf 함수는 C언어의 printf 문장처럼 표준 출력으로 포매팅된 문자열을 리턴한다. printf 문장은 포맷 지시자와 변경자 등의 제어 문자열을 가지고 있다. 제어 문자열은 콤마와 콤마로 분리된 표현식의 목록을 따른다.


'Linux > awk' 카테고리의 다른 글

match 연산자  (0) 2013.04.21
필드 분리자, 액션, 정규표현식, 메타문자  (0) 2013.04.21
awk programming  (0) 2013.04.21
Posted by scii
: