태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

awk 사용하기

IT/Unix|2011. 3. 3. 11:46

unix 나 linux 에서 sed, awk 만 알고 있으면 손가락이 고생을 덜합니다.. ㅎㅎ
예전에 어디서 퍼와서 저장해놨던건데.. 기억이 않나네요.. awk 에 대해 간단하게 정리한 내용입니다.

1. awk의 기본 개념

1) awk란? 
; awk란 이름은 이 유틸리티를 작성한 A.V.Aho, P.J. Weinberger, B. Kernigham의 머리글자를 따온 것
① awk는 일종의 프로그래밍 언어지만 일반적인 언어라기 보다는 주로 패턴의 검색과 조작을 주목적으로 만들어진 것이다. 
② 파일의 각 라인에서 필드(field)를 인식할 수 있는 패턴 매칭 기능을 가지고 이들 필드를 자유자재로 조작 가능한 유틸리티를 작성하고자
만든 것이다. 

2) awk의 응용분야 
데이터 프로세싱, 리포트 작성, 간단한 데이터베이스 구축, 등 

3) awk를 이용한 작업 
① 프로그래머가 자신이 작성한 프로그램의 입력 화일이 특정한 형식에 들어 맞게 이루어져 있는지 검사. 
② 출력화일을 처리하여 리포트를 만들어 냄. 
③ 다른 프로그램의 입력 형식에 맞게 변환하는 작업에 이용. 

2. awk 프로그램의 구조 및 실행

(1) awk 프로그램의 구조 

    1) awk ' pattern {action} 
         
        pattern {action} 
        . 
        . 
        . 
        ' filenames <-----------------입력화일(예제 : students) 
     
    2) awk -f parttern-action-file filenames <----- 입력화일
        awk실행 action을 가진 프로그램 file

(2) awk의 pattern 

  패 턴                 내      용 
================================================================================================ 
 BEGIN              입력화일을 읽어들이기 전에 옆에 제시되는 문자을 실행시키도록 한다. 
 END                awk가 모든 입력을 처리한 후, 옆에 제시되는 문장을 실행시키도록 한다. 
 expression         식을 평가한 후 이 식이 참, 즉 non-zero이거나 non-null인 경우 문장을 
                    실행한다. 
 /re/               정규식과 일치하는 문자열을 포함하고 있는 라인에서 문장을 실행한다. 
 compound-pattern   복합패턴이라는 것으로 &&(and), ||(or) , !(not) 그리고 괄호에 의해 연결시킨
                    것이다. expression의 경우와 마찬가지로 복합 패턴도 참인 경우의 문장을 실행 
                    시킨다. 
 pattern1,pattern2  이러한 패턴을 범위 패턴이라한다. 현재 처리되고 있는 라인이 pattern1과 일치 
                    되고, 다음에 따라오 는 라인 중 임의의 라인이 pattern2와 일치할 때, 범위
                    패턴은 두 라인 사이의 각 라인과 일치한다. 

(3) awk의 연산자
  연 산 자                내      용 
================================================================================================ 
 = += -= *= /= %=       배정(assignment)연산자 
 + - * / % ++ --        산술 연산자 
 || && !                논리 연산자(|| = OR, && = AND, ! = NOT) 
 > >= < <= == !=        비교 연산자 
 v ~p                   변수 V가 패턴 P에 부합되면 참 
 v !~p                  변수 V가 패턴 P에 부합되지 않으면 참 

(4) 액션(Actions) 
액션은 문장(statements)으로 이루어져 있다. 액션은 간단하게 상수 하나로 이루어질 수도 있고, 개행 문자나 세미콜론(;)에 의해 분리된 몇 개의 문장의 연속으로 구성될 수도 있다. 
    ① 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           현재 처리되고 있는 입력 파일의 이름 
 FS                 입력 필드 분리문자 
 NR                 현재 레코드(행)의 번호 
 NF                 현재 레코드(행)의 필드의 갯수 
 OFS                출력되는 필드의 분리문자 

3. awk의 기본예제
(1) 예제 입력 파일 소개 
    ① 입력화일의 이름은 students 
    ② 이 파일의 각 라인은 3개의 필드로 구성(학생 성명, 학과명, 나이) 
    ③ 각 필드는 공백에 의해서 분리(공백을 필드 분리자로 간주함.) 
    < awk는 각 라인에서 필드를 추출해 내는 데 필드 분리자(field separator)를 사용, 필드 분리자는 
      보통 하나 이상의 공백 문자이다.> 
     
1) 입력화일 예제 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 프린트하기 
    % awk '$3 > 22 {print $1}' students 
    Jack,T 
    Paul,R 
    John,T 
     
예 2) if 문을 사용하여 조건에 맞는 line 분리하기(각 파일에 저장) 
     
    step 1 : if문을 사용하는 프로그램을 awkprog1이라는 파일로 만든다. 
         
        % cat awkprog1 
        { if ($1 ~ /^J/) printf "%s\n", $0 > "Jfile" 
        if ($1 ~ /^P/) printf "%s\n", $0 > "Pfile"} 
     
    step 2 : students 입력화일에 awkpog1 프로그램 화일을 적용한다. 
         
        % 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) 평균값 구하기 
     
    <프로그램 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문을 이용하여 평균값 구하기 
     
    <프로그램 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 

댓글()