LINUX

[16] 리눅스 - awk란?

혀내 2022. 6. 21. 13:40
반응형

awk리눅스에서 사용하는 스크립트 언어로, 만든 개발자들의 이름 앞 글자를 따 이름을 지었다고 한다.

(Aho, Weinberger, Kernighan)

 

awk 프로그램

간단한 건 직접 입력해 수행할 수 있지만, 보통은 프로그램 파일로 작성해 -f 옵션으로 수행한다.

시스템은 텍스트 파일에서 각 줄(line)을 필드로 구분하고, 각 line마다 awk 프로그램이 지시하는 대로 처리한다.

 

$ awk 프로그램 파일* 
$ awk -f 프로그램파일 파일*

 

awk 프로그램의 구성

[ 조건 ] [ { 액션 } ]

→ 입력받은 파일에서 각 줄(line)을 스캔한 뒤, 만약 조건을 만족한다면 그 줄에서 액션을 수행합니다.

awk 시스템 변수

  • FILENAME : 현재 처리 중인 입력 파일의 이름
  • NR : 현재 레코드(line)의 번호
  • NF : 현재 레코드의 필드 개수
  • $1 : 첫 번째 필드
  • $NF : 마지막 필드
  • $0 : 한 줄 전체


 

 

조건

조건문의 종류

  • BEGIN : 파일의 시작
  • END : 파일의 끝
  • 관계 연산자, 논리 연산자를 포함한 조건식
  • /패턴/ : 패턴에 해당하는 줄
  • 패턴1, 패턴2 : 패턴1을 포함한 줄부터 패턴2를 포함한 줄까지

 

액션

액션에 들어가는 실행문들

  • if (조건) 실행문 [else 실행문]
  • while(조건) 실행문
  • for( 식; 조건; 식) 실행문
  • break
  • continue
  • 변수 = 식
  • print [식들의 리스트]
  • printf 포맷 [, 식들의 리스트]
  • next : 현재 줄에 대한 나머지 패턴들을 건너뜀
  • exit : 현재 줄의 나머지 부분들을 건너뜀
  • { 실행문 리스트 }

간단한 awk 프로그램의 예시)

# you.txt의 2번째 줄과 3번째 줄에서 '현재 줄 번호, 첫 번째 필드, 세 번째 필드, 마지막 필드'를 출력한다. 
$ awk `NR > 1 && NR < 4 { print NR, $1, $3, $NF }` you.txt 

# you.txt 파일의 끝에서 현재 줄 번호를 출력한다. 
$ awk `END { print NR } ` you.txt

awk 프로그램의 예시)

# 매 줄마다 첫 번째 필드와 마지막 필드를 출력하는 프로그램 

BEGIN { print "파일 시작:", FILENAME }   # BEGIN { 액션 } : 입력을 읽기 전에 주어진 '액션'을 먼저 실행 
{ print $1, $NF }                       # { 액션 } : 매 줄을 읽을 때마다 '동작' 실행 
END { print "파일 끝" }                  # END { 액션 } : 마지막에 주어진 '액션' 실행

# 각 줄마다 첫 번째 필드를 3번, 5번, 7번 ... , NF번 씩 출력하는 프로그램 

{ 
for (i = 3; i <= NF; i += 2) 
printf"%s", $1 
printf "\n" 
}
 
# st로 시작해 한 자리 이상의 다른 문자가 존재하고 e로 끝나는 문자열(패턴)이 있으면, 줄의 전체 내용을 출력하는 프로그램 

/st.*e/{print $0}
 
BEGIN{
  FS="[^a-zA-Z]+"          # FS : 필드 구분 변수, + : 1번 이상 (즉, 필드를 영어가 아닌 문자열을 기준으로 구분한다) 
} 
{ 
  for (i=1; i<=NF; i++) 
    words[tolower($i)]++   # words 배열에 각 필드를 소문자로 변환해 저장한다. 
} 
END { 
  for (w in words)         # 소문자로 저장된 문자열들을 불러와 
    print w, word[w]       # 출력한다. 
}

반응형