16장. AWK
1. awk의 기본 개념
1) awk란?
; awk란 이름은 이 Utility를 작성한 A.V.Aho, P.J. Weinberger, B. Kernigham의 머리글자를 따온 것
① awk는 일종의 Programming 언어지만 일반적인 언어라기 보다는 주로 Pattern의 검색과 조작을 주목적으로 만들어진 것이다.
② File의 각 라인에서 Field를 인식할 수 있는 Pattern Matching 기능을 가지고 이들 Field를 자유자재로 조작 가능한 Utility를 작성하고자 만든 것이다.
2) awk의 응용분야
Data Processing, Report 작성, 간단한 Database 구축, 등
3) awk를 이용한 작업
① Programmer가 자신이 작성한 Program의 입력 File이 특정한 형식에 들어 맞게 이루어져 있는지 검사.
② 출력 File을 처리하여 Report를 만들어 냄.
③ 다른 Program의 입력 형식에 맞게 변환하는 작업에 이용.
2. awk Program의 구조 및 실행
(1) awk Program의 구조
1) awk ' pattern {action}
pattern {action}
' filenames <-----------------입력File(예제: students)
2) awk -f parttern-action-file filenames <----- 입력 File
awk실행 action을 가진 Program file
(2) awk의 pattern
|
Pattern |
내용 |
|
BEGIN |
입력 File을 읽어 들이기 전에 옆에 제시되는 문자를 실행시키도록 한다. |
|
END |
awk가 모든 입력을 처리한 후, 옆에 제시되는 문장을 실행시키도록 한다. |
|
Expression |
식을 평가한 후 이 식이 참, 즉 non-zero이거나 non-null 인 경우 문장을 실행한다. |
|
/re/ |
정규식과 일치하는 문자열을 포함하고 있는 Line에서 문장을 실행한다. |
|
compound-pattern |
복합 Pattern이라는 것으로 && (and), || (or), ! (not) 그리고 괄호에 의해 연결 시킨 것이다. Expression의 경우와 마찬가지로 복합 Pattern도 참인 경우의 문장을 실행시킨다. |
|
pattern1, pattern2 |
이러한 Pattern을 범위 Pattern이라 한다. 현재 처리되고 있는 Line이 pattern1과 일치 되고, 다음에 따라오는 Line 중 임의의 라인이 pattern2와 일치할 때, 범위 Pattern은 두 Line 사이의 각 라인과 일치한다. |
(3) awk의 연산자
|
연 산 자 |
내 용 |
|
= += -= *= /= %= |
배정(assignment) 연산자 |
|
+ - * / % ++ -- |
산술 연산자 |
|
|| && ! |
논리 연산자(|| = OR, && = AND, ! = NOT) |
|
> >= < <= == != |
비교 연산자 |
|
v ~p |
변수 V가 Pattern P에 부합되면 참 |
|
v !~p |
변수 V가 Pattern P에 부합되지 않으면 참 |
(4) Actions
Action은 문장(statements)으로 이루어져 있다. Action은 간단하게 상수 하나로 이루어질 수도 있고, 개행 문자나 세미콜론(;)에 의해 분리된 몇 개의 문장의 연속으로 구성될 수도 있다.
① expressions
② print expression-list
③ printf(format, expression-list)
④ if (expression) statement
⑤ if (expression) statement else statement
⑥ while (expression) statement
⑦ for (expression; expression; expression) statement
⑧ for (variable in array) statement
⑨ do statement while (expression)
⑩ break
⑪ continue
⑫ next
⑬ exit
⑭ exit expression
⑮ {statement}
(5) awk에서 미리 정의된 몇 가지 변수들
|
변 수 |
내 용 |
|
FILENAME |
현재 처리되고 있는 입력 File의 이름 |
|
FS |
입력 Field 분리 문자 |
|
NR |
현재 Record (행)의 번호 |
|
NF |
현재 Record (행)의 Field의 개수 |
|
OFS |
출력되는 Field의 분리문자 |
3. awk의 기본예제
(1) 예제 입력 File 소개
① 입력 File의 이름은 students
② 이 File의 각 Line은 3개의 Field로 구성(학생 성명, 학과명, 나이)
③ 각 Field는 공백에 의해서 분리(공백을 Field 분리자로 간주함.)
<awk는 각 Line에서 Field를 추출해 내는데 필드 분리자(Field Separator)를 사용, Field 분리자는 보통 하나 이상의 공백 문자이다.>
1) 입력 File 예제 Students
% cat students
John,P Physics 20
Rick,L Mechanical 21
Jack,T electrical 23
Larry,M Chemical 22
Phil,R Electrical 21
Mike,T mechanical 22
Paul,R Chemical 23
John,T Chemical 23
Tony,N Chemical 22
James,R Electrical 21
예 1) 식(expression)에 맞는 Field Print 하기
% awk '$3 > 22 {print $1}' students
Jack,T
Paul,R
John,T
예 2) if 문을 사용하여 조건에 맞는 Line 분리하기(각 File에 저장)
step 1 : if문을 사용하는 Program을 awkprog1이라는 File로 만든다.
% cat awkprog1
{ if ($1 ~ /^J/) printf "%s\n", $0 > "Jfile"
if ($1 ~ /^P/) printf "%s\n", $0 > "Pfile"}
step 2 : Students 입력 File에 awkpog1 Program File을 적용한다.
% awk -f awkprog1 students
step 3 : 결과 보기
% cat Jfile
John,P Physics 20
Jack,T electrical 23
John,T Chemical 23
James,R Electrical 21
% cat Pfile
Phil,R Electrical 21
Paul,R Chemical 23
예 3) 평균값 구하기
<Program awkprog2, awkprog3>
% cat awkprog2
{sum += $3}
END {printf "The average of the ages is %.2f\n", sum/NR}
% cat awkprog3
{sum += $3
++no}
END {printf "The average of the ages is %.2f\n", sum/no}
<결 과>
% awk -f awkprog3 students
The average of the ages is 21.80
예 4) while 과 do문을 이용하여 평균값 구하기
<Program awkprog4>
% cat awkprog4
{if (NF > 0) {
sum = 0
n = 1
while (n <= NF) {
sum = sum + $n
n = n+1
}
printf "Average is %d\n", sum/NF
}
else
print}
<예 제>
% awk -f awkprog4 test
Average is 17
Average is 3
Average is 25
Average is 0
'Operating System > Solaris' 카테고리의 다른 글
| POWER ADMIN for SUN (System Error 및 Q&A) (0) | 2007/08/07 |
|---|---|
| POWER ADMIN for SUN (System Backup 및 Device) (0) | 2007/08/06 |
| POWER ADMIN for SUN (VI Editor) (0) | 2007/08/05 |
| POWER ADMIN for SUN (Unix C-Shell Programming) (0) | 2007/08/04 |
| POWER ADMIN for SUN (sed) (0) | 2007/08/03 |
| POWER ADMIN for SUN (AWK) (0) | 2007/08/02 |
| POWER ADMIN for SUN (System Tuning) (0) | 2007/08/01 |
| POWER ADMIN for SUN (PPP) (0) | 2007/07/31 |
| POWER ADMIN for SUN (FTP) (0) | 2007/07/30 |
| POWER ADMIN for SUN (NFS) (0) | 2007/07/29 |
| POWER ADMIN for SUN (DNS) (0) | 2007/07/28 |