awk는 텍스트를 입력으로 받아 이를 가공하여 출력하는 programming language이다.
그 활용 범위가 상당히 넓어 상당히 많이 쓰이는 language이다.


<awk program의 구조>

BEGIN {
actions A
}

[condition B] {
actions B
}

[condition C] {
actions C
}

                 .
                 .
                 .

END {
actions D
}

전체 프로그램의 구조는 위와 같다.

1. awk가 실행되면 텍스트 입력을 읽기 전에 actions A를 실행한다. (생략 가능)
2. 텍스트 입력을 한 record씩 받아와 그 record가 condition B를 만족하면 actions B를 수행한다. 그리고 또 그 record가 condition C를 만족하면 actions C를 실행한다.
3. 모든 텍스트의 record에 대해 2의 과정을 반복한다.
3. 마치기 전 actions D를 실행한다. (생략 가능)

여기서 중요한 것이 텍스트 입력을 한 record씩 받아와 actions B와 actions C등을 모두 실행한다는 것이다.
자세히 말해 awk는 텍스트 입력의 한 record를 받아와 actions Bactions C등을 모두 수행하고, 그 다음 record를 다시 받아와 actions Bactions C를 모두 수행하는 과정을 텍스트 입력의 마지막까지 계속해서 반복 수행하는 것이다.
그리고 앞부분의 BEGIN {}, 뒷부분의 END {}은 생략이 가능하다.

여기에서 record란, 텍스트를 나누게 하는 하나의 단위이다.
이처럼 텍스트를 나누는 단위는 awk에서 크게 두 가지로 나누어진다.
이들은 recordfield이다. 
하나의 텍스트는 여러 개의 record로 이루어져 있으며,
하나의 record는 여러 개의 field를 포함하고 있다.
awk에서 record를 나누는 default 단위는 \n(newline)이다.
그리고 field를 나누는 default 단위는 ' '(space)이다.
이들 record와 field를 나누는 단위는 바꿀 수 있으며, 이는 이후에 살펴보도록 한다.

예를 들어 다음 텍스트를 보자.

john 85 92 78 94 88
andrea 89 90 75 90 86
jasper 84 88 80 92 84

즉 위의 예제에서 record는 총 3개
Record 1: john 85 92 78 94 88
Record 2: andrea 89 90 75 90 86
Record 3: jasper 84 88 80 92 84
이다.

그리고 record 1에서 field는 총 6개
Field 1: john
Field 2: 85
Field 3: 92
Field 4: 78
Field 5: 94
Field 6: 88
이다.

awk 프로그램 내부에서 현재 수행하고 있는 record에서 각각의 field를 나타낼 때 사용하는 syntax는 다음과 같다. (awk는 record를 하나씩 읽어와 수행하므로 record를 지칭하는 syntax는 없다.)
$n: Field n을 지칭.
$0: 현재 수행하고 있는 record.

예)
{
print $1, ": ", ($2 + $3 + $4 + $5 + $6)/5;
}

아래와 같은 awk program을 사용하여 위의 예를 입력으로 넣는다면
(awk program에서 괄호({) 앞의 condition은 생략이 가능하다. 생략되면 모든 record에 대해 해당 action을 수행한다.)
결과는 다음과 같다.

john 87.4
andrea 86
jasper 85.6

awk program은 첫번째 record, record 1을 가져와
첫번째 field를 출력하고, ': '를 출력한 다음, 두번째부터 여섯번째 필드까지의 수를 더한 다음 5로 나누어 평균을 구하고, 이를 출력한다.
이러한 과정을 텍스트 마지막, record 3까지 반복하여 수행하여 위와 같은 결과를 얻는다.

'Linux' 카테고리의 다른 글

[awk] awk 사용법#3 - Statements  (0) 2010.05.14
[awk] awk 사용법#2 - awk program basic  (0) 2010.05.13
[CVS] CVS 사용법  (0) 2010.05.11
[Linux] Linux Command Summary  (0) 2010.04.16
[Linux] Regular Expression  (0) 2010.04.16
Posted by sunshowers
,