[unix] awk

unix . linux 2013. 4. 1. 15:34

출처http://ra2kstar.tistory.com


unix나 linux 를 사용하면서 많이 쓰게 되는 awk에 대해서 공부해 본다. 사실... 쉘 스크립트를 자주 보게 되는데 awk 문법이 자주 보여서 공부해야 할 필요성을 느꼈다. 



  awk 

awk 는 필드 단위로 패턴을 검색하고, 조작하는 것을 주 목적으로 한다. 파일 내의 각 라인 (레코드)에 대한 필드 를 인식할 수 있는 패턴 검색 기능을 보유하고 있으며, 이를 이용해서 조작도 가능하다. 


awk [-f 프로그램파일] [-F 필드구분자] ["패턴{액션}"] [처리할 파일명]

옵션

-f 프로그램 파일 

awk 유틸리티의 실행 액션이 저장된 프로그램 파일을 지정

-F 필드 구분자 

필드 구분자를 지정

"패턴{액션}"       

패턴이 일치하면 액션이 실행된다. 

사용예

$> awk -F : "{print $1, $6}" ./text.txt

= text.txt 파일에서 ":" 구부자를 이용하여 1번째와 6번째 필드를 프린트




  패턴과 액션의 구조 

awk의 옵션 중의 하나였던 ["패턴{액션}"] 에서도 여러가지 구조가 존재한다. 가장 대표적인 3가지를 알아보자 


1. BEGIN 

- 첫번째 레코드를 읽기 전에 지정된 액션을 실행 

2. END 

- 마지막 레코드를 읽고 난 후, 지정된 액션을 실행 

3. PATTERN 

- 입력되는 각 라인(레코드)별로 실행되며, 만약 그 라인이 패턴과 일치할 경우 액션이 실행된다. 

- 정규표현식의 경우 "/정규식/"  으로 나타낸다. 

- 패턴만 있는 경우 : 패턴과 일치하는 라인을 화면에 출력한다. 

- 액션만 있는경우 : 모든 라인이 액션의 대상이 된다. 



  awk 시스템 변수 

awk가 내부적으로 인식하는 변수들이다. 이것을 이용하면 조금 더 효율적으로 사용 할 수 있다. 


변수명 

내용 

FILENAME 

현재 처리중인 파일명 

FS 

필드 구분자로 디폴트는 공백 

RS 

레코드 구분자로 디폴트는 새로운 라인 

NF 

현재 레코드의 필드 개수 

NR 

현재 레코드의 번호 

OFS 

출력할 때 사용하는 FS 

ORS 

출력할 때 사용하는 RS 

$0 

입력 레코드의 전체 

$n 

입력 레코드의 n번째 필드 



  awk 사용 예 

awk "{print FILENAME}" test.txt 

= test.txt 파일의 레코드 개수만큼 파일이름을 출력한다


awk "{print NR}" test.txt

= test.txt 파일의 레코드 번호를 출력한다. 


awk 'BEGIN {FS="\t"} {print $1 ,  $2}' test.txt

= test.txt 파일의 필드 구분자를 "\t" 으로 지정하고, 1번째와 2번째 필드를 프린트 한다. 

awk 'BEGIN {FS="\t"; OFS ="-"} {print $1 ,  $2} END {print "총 레코드의 수 : " NR}' test.txt
= test.txt 파일의 필드 구분자를 "\t" 로 지정하고, 1번째와 2번째 필드를 프린트 하되, 필드 구분자를 "-"
로 바꾸어 출력하고, 모든 레코드가 끝난 뒤, 총 레코드의 수를 출력한다. 


  결과화면


'unix . linux' 카테고리의 다른 글

[Unix/Linux] SVN_EDITOR 설정  (0) 2013.04.01
[unix] 원격파일전송[scp / rsync]  (0) 2013.04.01
[unix] sort  (0) 2013.04.01
[unix] tar.gz 압축 및 해제  (0) 2013.04.01
[unix] 용량확인[df/ du]  (0) 2013.04.01
Posted by airlueos
,