관리 메뉴

데브로맨스

【 gawk 】 본문

>
【 에디터 】/GNU awk

【 gawk 】

데브로맨스 2022. 2. 16. 16:53
반응형

목차

     개념

    • UNIX 에서 사용되던 awk 프로그램의 GNU 버전

     

     배경

    • 문자열 및 바이너리 데이터 스트림 수정 및 재구성할 수 있는 좀 더 프로그래밍에 가까운 환경을 제공하는 고급 문자열 데이터 조작 툴이 필요하게 되어 등장

     

     기능

    • 데이터를 저장하는 변수 정의
    • 데이터를 다루기 위한 산술 및 문자열 연산자 사용
    • 조건문 및 반복문과 같이 데이터 처리에 로직을 추가하는 구조적 프로그래밍 개념 사용
    • 데이터 파일 안에서 데이터 요소를 추출하고 다른 순서 또는 형식으로 재구성하여 형식화된 보고서 생성
    •  

     

     동작

    • sed 편집기처럼 문자열 데이터 스트림에서 사용할 수 있는 텍스트의 각 줄에 대해 프로그램 스크립트를 실행
    • 버퍼 관리 ( Buffer Operation )
      •  

     장/단점

     특징

     

     

    반응형

     문법

    【 문법 】

     gawk 【-options】 【'BEGIN { script; script; ... } { script; script; ... } END { script; script; ... } '】
     option(s)  -F, -f, -var, -mf, -mr, -W. -b
     '{script; ... }'  script 를 하나의 문자열로 가정하기 때문에 홑다옴표로 묶어야 한다.
     script 명령은 두 중괄호 사이에 있어야 한다.
     여러 개의 명령을 수행하고 싶을 때는 각 명령 사이에 세미콜론을 넣어주면 된다.
     BEGIN { ... } 데이터 스트림을 처리하기 전에 스크립트 명령 실행하기
     END { ... } 데이터 스트림을 처리한 후 스크립트 명령 실행하기

     

    【 변수 】

       설명
     변수 참조  변수의 값을 참조할 때 달러 ( $ ) 기호를 사용하지 않는다.

     

    【 옵션 】

     옵션  설명
     -F fs  한 줄에서 데이터 필드의 경계를 식별하기 위한 파일  구분자를 지정한다.
     -f file  프로그램이 읽어 들일 파일 이름을 지정한다.
     -var=value  gawk 프로그램에서 사용할 변수의 기본 값을 정의한다.
     -mf N  데이터 파일에서 처리할 필드의 최대 수를 지정한다.
     -mr N  데이터 파일의 최대 레코드 크기를 지정한다.
     -W keyword  gawk 의 호환성 모드 또는 경고 수준을 지정한다.
     -b  바이너리 데이터를 다룰 수 있다.

     

    【 명령 】

    • 여러 명령을 사용하려면 각 명령 사이에 세미콜론 ';' 을 넣으면 된다.
    명령 설명
     print  표준 출력 ( STDOUT ) 으로 문자 ( 열 ) 를 출력한다.

     

    【 데이터 필드 변수 】

    • 입력받은 문자(열) 데이터 스트림에서  검출된 각 문자(열) 데이터 필드에 다음 변수를 대입한다.
    • 한 줄 안에서 각 데이터 필드는 필드 구분자로 결정된다.
    • 문자열 한 줄을 읽을 때 이 줄은 지정된 필드 구분자를 사용해서 각 데이터 필드로 구분된다.
    • 기본 필드 구분자는 '화이트 스페이스 문자 ( 탭 or 빈 칸 )'다.
    필드 변수 설명
     $0  텍스트의 전체 줄
     $1  텍스트의 줄에서 첫 번째 데이터 필드
     $2  텍스트의 줄에서 두 번째 데이터 필드
     $n  텍스트의 줄에서 n 번째 데이터 필드

     

     예제 - Command-LIne 에서 프로그램 스크립트 읽기

    $ gawk '{print "Hi"}'    // exam 1)
    >
    
    $ $ gawk '{print "Hi"}'  // exam 2)
    > This is a test
    Hi
    > hello
    Hi
    > This is another test
    Hi

    첫 번째 예제에서, 이 명령을 실행하면 아무 일도 일어나지 않고 입력받기 위해 대기한다. 입력 파일을 지정을 하지 않았기 때문에 표준 입력 ( STDIN ) 으로부터 데이터 스트림을 받기 위해 대기한다. 두 번째 예제처럼 대기 상태에서 키보드 입력으로부터 문자열 데이터 스트림을 \n 까지 한 줄 받고 나면 print 명령을 수행하게 되어 "Hi" 가 표준 출력으로 보내지게 되어 모니터에 출력된다. gawk 프로그램을 종료하려면 데이터 스트림이 종료되었다는 신호 ( EOF 문자 입력 ) 를 보내야 하는데, bash 에서 < Ctrl > + < D > 키 조합은 EOF 문자를 만들어 낸다. 이 신호를 받고나면 프로그램은 종료된다.

     

     예제 - 데이터 필드 사용하기

    $ cat data.txt
    ONe line of test text.
    Two lines of test text.
    Three lines of test txt.
    $
    $ gawk '{print $1}' data.txt    // exam 1)
    One
    Two
    Three
    
    $ gawk -F: '{print $1}' /etc/passwd    // exam2)
    root
    bin
    daemon
    [ ... ]

    첫 번째 예제는, 텍스트의 각 줄에 있는 문자열에서 첫 번째 데이터 필드만을 표시하기 위해 $1 로 필드 변수를 사용한다. 두 번째 예제는 -F 옵션으로 콜론 ':'을 필드 구분자로 지정하여 텍스트의 각 줄에 있는 문자열을 분리하여 첫 번째 데이터 필드만을 표준 출력을 통해 모니터로 출력한다.

     

     예제 - 프로그램 스크립트에서 여러 명령 사용하기

    $ echo "My name is Rich" | gawk '{$4="Christine"; print $0}'    // exam 1)
    My name is Christine
    
    $ gawk '{            // exam 2)
    > $4="Christine"
    > print $0}'
    My name is Rich
    My name is Christine

    첫 번째 예제는, 표준 입력 ( STDIN ) 으로부터 입력된 문자열 데이터 스트림에서 4번째 필드 문자열을 치환 후 줄 전체를 표준 출력 ( STDOUT ) 을 통해 모니터로 출력한다. 두 번째 예제는, 한 번에 하나의 스크립트 명령을 입력할 수 있도록 보조 프롬프트를 사용한다. 표준 입력을 통해 들어오는 문자열 데이터 스트림에 명령을 수행하며 종료를 하고 싶을 때는 데이터 스트림의 끝을 알리는 Ctrl + D 키 조합을 누른다. 

     

     예제 - 파일로부터 프로그램 읽기

    $ cat script.gawk
    {print $1 "'s home directory is " $6}
    $
    $ gawk -F: -f script.gawk /etc/passwd    exam 1)
    root's home directory is /root
    bin's home directory is /bin
    [ ... ]
    
    $ cat script.gawk
    {
    test = "'s home directory is "
    print $1 text $6
    }
    $ gawk -F: -f script.gawk /etc/passwd    // exam 2)
    root's home directory is /root
    bin's home directory is /bin
    [ ... ]

    첫 번째 예제는, 텍스트 파일에 작성한 스크립트 명령을 읽어 와서 수행한다. /etc/passwd 에서 새줄 문자 ( newline ) 로 구분된 문자열 데이터 스크림을 한 줄 읽어 들여 -F 로 지정한 구분 문자로 필드를 나눈 후 첫 번째 필드와 여섯 번째 필드를 표준 출력 ( STDOUT ) 으로 보내 모니터로 출력한다. 두 번째 예제는, text 변수에 문자열을 저장하고 변수에 저장된 값을 참조하여 $1, $6 필드의 문자열과 함께 결과 값을 출력한다. 

     

     예제 - 데이터를 처리하기 전에 스크립트 실행하기

    $ gawk 'BEGIN {print "Hello World!"}'    // exam 1)
    Hello World!
    
    $ cat data.txt
    Line 1
    Line 2
    Line 3
    $
    $ gawk ' BEGIN {print "The data File Contents:"}    // exam 2)
    > {print $0}' data.txt'
    The data File Contents:
    Line 1
    Line 2
    Line 3

    이 예제를 통해 알수 있는 건, 문자열 데이터 스트림을 입력 받기 전에 BEGIN 에서 지정한 스크립트 명령을 먼저 딱 한번 수핸다는 것을 알 수 있다.

     

     예제 - 데이터를 처리한 후 스크립트 실행하기

    $ gawk 'BEGIN {print "The data File Contents:"}
    > {print $0}
    > END {print "End of File"}' data.txt
    The data File Contents:
    Line 1
    Line 2
    LIne 3
    End of File

    이 예제를 통해 알 수 있는 건, BEGIN 과 마찬가지로 문자열 데이터 스트림을 모두 입력 받은 후 END 에서 지정한 스크립트 명령을 딱 한번 수행한다.

     

     예제

    $ cat script.gawk
    BEGIN {
    print "The latest list of users and shells"
    print " UserID \t Shell"
    print "-------- \t --------"
    FS=":"
    }
    {
    print $1 "         -t " $7
    }
    END {
    print "This concludes the listing"
    }
    $
    $ gawk -f script.gawk /etc/passwd
    The latest list of users and shells
    UserID          Shell
    --------        --------
    root            /bin/bash
    [ ... ]

    이 예제에서 알 수 있는 것은, FS 라는 특별한 변수를 정의한 것을 볼 수 있다. 이는 필드 구분자를 정의하는 또 다른 방법이다. 이 방법을 쓰면 스크립트 사용자가 Command-Line 에 필드 구분자를 정의할 필요가 없다. 

     

     고급

     

     

    반응형
    Comments