적외선 2012. 3. 20. 13:45

awk란?

  • text 데이터나 리포드를 작성 하는 데 사용 되는 프로그래밍 언어.
  • 표준입력 으로 들어오는 데이타를 처리하여 , 표준 출력으로 출력 하는 프로그램
  • 프롬프트상에서 간단히 입력 할 수도 있고, 복잡한 프로그램을 작성 할 수도 있다

AWK command format

파일을 통한 입력

awk 'pattern' filename
awk '{ action }' filename
awk 'pattern { action }' filename 

ex>
$ awk '/닉스/' employees                   // 패턴검색
$ awk ' { print $1 }' employees           // 파일의 모든 라인에 대해서 해당 명령 처리
$ awk '/닉스/{ print $1,$2 }' employees    // 패턴검색 후 해당 라인에 대한 명령 처리

파이프를 통한 입력.

command | awk 'pattern' filename
command | awk '{ action }' filename
command | awk 'pattern { action }' filename 

ex>
  $ df | awk '$4 > 300000'
  $ w | awk '/fith/{ print $1,$3 }' 

출력 형식 지정 (print)

  $ date | awk '{print "현재 년도 :" $1 "\n현재 월 : " $2}' 

  - \b : 백 스페이스            - \f : form feed    - \n : new line
  - \r : carriage return     - \t : tab          - \x : escape caracter x 

  $ awk '/닉스/{print "\t\tHave a nice day," $1,$2 "!"}' employees 

C style output format ( printf )

  $ echo "UNIX" | awk '{ printf "|%-15s|\n",$1 }'
  $ echo "UNIX" | awk '{ printf "|%15s|\n",$1 }'
  $ awk '{ printf "The name is: %-15s ,ID is %8d\n", $1$2,$3 }' employees 

  - %c : ASCII 문자 하나.   - %s : ASCII 문자열.     - %f : 부동소수점. 
  - %d : 10 진수.          - %o : 8 진수 .          - %x : 16 진수 .

AWK script

사용 예

  $ awk -f awkfile employees 

AWK 의 시스템 변수

변수설명
FILENAME 현재파일명
FS 필드 구분자
NF 현재라인의 필드 수
NR 현재라인의 레코드 번호
OFMT 숫자 출력을 위한 포맷(예를 들어 %.6g)
OFS 출력 필드 구분자(디폴트는 blank)
ORS 출력 레코드 구분자(디폴트는 newline)
RS 레코드 구분자(디폴트는 newline)
$0 전체 입력라인
$n n번째 필드의 내용(각 필드는 FS로 구분된다.)

AWK 의 시스템 변수 세부 설명

  • Records AND Fields
    • Records : awk 는 입력의 한 라인, 한 라인을 Record 라고 부른다.
    • The Record Separator
      • awk 는 기본적으로 carriage return 으로 각 record 를 구분.
      • ORS ,RS 등의 내부 awk 내부 변수로 제한적으로 조정 가능.
  • $0 : awk 는 $0 으로 record 전체를 참조 할수 있다. print 의 기본 값으로 사용 된다.
  $ awk '{ print $0 }' employees
  $ awk '{ print }' employees 
  • NR : awk 는 처리한 record 의 번호를 NR 이라는 내부 변수로 저장 한다. ($NR 아님!)
  $ awk '{ print NR , $0 }' employees 
  • Fields : awk 의 각 record 는 space,tab 으로 구분된 단어로 이루어져 있는데, 이 단어들을 Field 라 부른다.
    • The Fields Separators
      • awk 는 기본적으로 spacebar ,tab 등으로 각 field 를 구분.
      • -F 옵션이나 ,FS 변수를 통해 변경 가능. -F 옵션이 주로 쓰인다.
  $ awk -F: '/^root/{print $6 ,$7}' /etc/passwd
  $ awk -F'[ :\t]' '{ print $1,$2,$3}' /etc/passwd 

Regular Expression

  $ awk '/^[A-Z][a-z]+ /' employees
  $ awk '$1 ~ /[Bb]ill/' employees
  $ awk '$1 !~ /[Bb]ill/' employees 

Operators

  • < , ⇐ , == , != , >=, > ,&& ,||,!
  $ awk '$3 > 1234' employees
  $ awk '$3 > 1234 && 4500 > $3' employees
  $ awk '!($3 < 1234 || 4500 < $3)' employees