반응형

개요

Shell Programming 뿐만 아니라 기본적으로 로그 파일 변환 및 필터링시 유용하면 아주 강력한 Awk 유틸리티에 대한 일반적인 내용을 다룹니다.


문법

BEGIN : 실행하기전 전처리 단계 preprocess
ROUTINE {} : 수행
END : 처리 후 수행

ex)

$ cat sedscr
aa 90
bb 30
dd 99

$ cat sedscr | awk 'BEGIN{ sum = 0; print " "; } {sum += $2} END {print " : " sum}'
  : 219

ex - file version)

$ 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 : 현재 파일명

 


기타


스크립트
 

  1. 패턴 {동작}
    패턴, 동작 전체를 단일 따옴표로 묶어야한다.
    특정 패턴에 대해 동작하게 한다.
    패턴이 없으면 모든 레코드에 대해 동작한다.
  2. 패턴
    /정규표현식/ : sed가 지원하지 않는것까지 모두 지원
    비교연산 : 숫자 문자 비교 가능
    패턴매칭연산 : ~ 일치하는 부분, !~ 일치하지 않는 부분
    BEGIN : 레코드 읽기전 할일
    END : 레코드 읽고 나서 할일


동작
 

  1. 모두 {}로 둘러싸여야한다.
    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

연산자
 

  1. 산술 : =, +=, -=, *=, /=, %=
  2. 조건 : ? : 논리: ||, &&, ! 패턴: ~, !~
  3. 비교 : <, <=, >, >=, !=,==
  4. 증감 : ++, -- 필드 참조 : $
  5. 제어문 (C의 제어문과 같다)
    break
    continue
    do {실행} while (조건)
    exit
    for (관계형 배열의 요소) {실행}
    펄의 foreach와 같다
    if (조건) {실행} else {실행}
    return
    while


명령어

  1. 문자열연산
    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)
  2. 수치 연산
    atan2(x,y) : y/x의 arctangent 값을 라디안 단위로 넘겨준다.
    cos(x)
    exp(arg)
    int(arg)
    log(arg)
    rand() : 0과 1사이의 난수를 발생
    sin(x)
    sqrt(arg)
    srand(expr)
  3. 입출력 프로세스
    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) : 시스템 내부 명령어 실행
  4. 예제
    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 '

 

 
출처 : http://yaaong.tistory.com/32 
반응형

+ Recent posts