$ cat sum.awk #!/bin/awk
#
# This Program is for Summing of exam_result.
#
# BEGIN :
BEGIN {
sum = 0;
print " ";
}
# ROUTINE :
{
sum += $2;
}
# END :
END {
print " : " sum;
average = sum / 3;
print " : " average;
}
$ cat sedscr | awk -f sum.awk : 219 : 73
내부 변수
FS : - Fields Seperator : BEGIN에서 재정의 함으로써 구분자를 바꿀수 있다.
RS : - Records Seperator : BEGIN에서 재정의 함으로써 레코드 구분자를 바꿀 수 있다.
NF : (Number of Fields)
NR : (Number of Records)
FNR : 입력파일이 여러개 인경우 현재 파일에서 NF를 표시한다.
OFS : FS( Output Fields Seperator ). 출력시의 FS
ORS : RS( Output Records Seperator ). 출력시의 RS
FILENAME : 현재 파일명
기타
스크립트
패턴 {동작}
패턴, 동작 전체를 단일 따옴표로 묶어야한다.
특정 패턴에 대해 동작하게 한다.
패턴이 없으면 모든 레코드에 대해 동작한다.
패턴
/정규표현식/ : sed가 지원하지 않는것까지 모두 지원
비교연산 : 숫자 문자 비교 가능
패턴매칭연산 : ~ 일치하는 부분, !~ 일치하지 않는 부분
BEGIN : 레코드 읽기전 할일
END : 레코드 읽고 나서 할일
동작
모두 {}로 둘러싸여야한다.
ex)
> good이라는 문자열을 포함한 모든 레코드 출력
/good/
> good이라는 문자열을 포함한 첫번째 레코드 출력
/good/ {print $1}
> 두개 이상의 필드를 가지는 모든 레코드 출력
NF > 2
> 한라인을 필드로, 빈라인을 레코드로 구분
BEGIN {FS="\n";RS=""}
/good/ {++x} END {print x}
{ total += $2 } END { print "Total of $2: " , total }
length($0) < 20 /* 라인의길이가 20이하인 것 출력 */
NF == 4 && /^good/
NF > 0
연산자
산술 : =, +=, -=, *=, /=, %=
조건 : ? : 논리: ||, &&, ! 패턴: ~, !~
비교 : <, <=, >, >=, !=,==
증감 : ++, -- 필드 참조 : $
제어문 (C의 제어문과 같다)
break
continue
do {실행} while (조건)
exit
for (관계형 배열의 요소) {실행}
펄의 foreach와 같다
if (조건) {실행} else {실행}
return
while
명령어
문자열연산
gsub(reg,s) : 정규식 r을 s로 치환
gsub(reg,s1,s2) : s2에서 정규식 r을 s1으로 대치한다.
index(s1,s2) : s1에서 s2의 위치 넘겨줌 없음 0
length(arg)
match(s,r) : r의 매칭되는 부분의 위치를 넘겨줌
split(string,array[,seperator]) : 구분자를 기준으로(디폴트 공백)해서 지정한 문자열을
배열로 만든다.
sub(r,s), sub(r,s1,s2) : gsub와 동일하나 여러개 일치해도 처음것만 실행
substr(s,m) : s에서 m번째 부터 끝까지 문자 리터
substr(s,m,n) : m에서 n까지
tolower(str)
touper(str)
수치 연산
atan2(x,y) : y/x의 arctangent 값을 라디안 단위로 넘겨준다.
cos(x)
exp(arg)
int(arg)
log(arg)
rand() : 0과 1사이의 난수를 발생
sin(x)
sqrt(arg)
srand(expr)
입출력 프로세스
close(filename) : 지정한 파일 닫는다.
close(cmd) : 명령어 파이프 닫는다
delete array?element : 지정한 배열 요소 지운다
getline() : 다음 레코드 읽어 들인다.
getline?variable [< "filename"] : 파일에서 읽어 들인다.
next : 다음 레코드(라인)을 입력받는다, getline과 비슷하지만 /패턴/동작을 새롭게 시작>
한다.
print ?args ?> "filename" : 인자를 출력한다.
printf "format" [,expressions] ?> "filename" : 형식에 맞춰 출력
sprintf (format [,expressions]) : 출력은 안하고 리턴만한다.
system(command) : 시스템 내부 명령어 실행
예제
awk ' BEGIN { for (i = 1;i<=7,i++) print int(101*rand()) }'
ls -l file1 file2 file3 | awk ' { x += $5 } ; END { print "Total bytes : " x } '
awk ' END { print NR } ' filename
awk ' NR % 2 == 0 '