본문 바로가기
IT

awk 명령어

by 이농이능 2018. 3. 8.

 awk(오크) 

패턴 탐색과 처리를 위한 명령어. 필드 단위의 패턴을 처리하는 언어(field-oriented pattern)이다.

입력으로부터 한 줄씩 읽어서 정규 표현식으로 조건이 맞는지 검사하고 판명되면 그 줄에 대해 명령어를 실행한다. 


유닉스에서 처음 개발된 일반 스크립트 언어.문자열 데이터와 배열, 정규표현식을 주로 사용됨.

* 스크립트 언어 : 컴퓨터 프로그래밍 언어로써 응용SW를 말함. 매우 빠르게 배우고 작성하기 위해 고안되었으며 상대적으로 단순한 구문과 의미를 내포함. 



1. awk 프로그램 구조


/패턴/ { 동작 }

$ awk '/pattern/' filename { 동작 }


패턴 : 정규 표현식

동작 : 실행명령

awk는 입력파일을 처음부터 한 줄씩 입력받아 주어진 패턴과 일치하는 줄을 찾으면 그 줄에서 동작에 해당하는 명령을 실행한다. 



BEGIN { 동작 }     # 입력을 읽기 전에 주어진 '동작'을 먼저 실행

END { 액션 }        # 입력을 모두 훑고 마지막에 주어진 '액션'을 실행

/패턴/                # '패턴'에 일치하는 줄을 출력

{ 동작 }               # 매 줄을 읽을 때마다 '동작'을 실행


[awk 기본 문법]
awk   [-f prog-file]   [-F c]   [ 'pattern {action}' ]   [filename]  

 
  -f prog-file           # awk의 실행 Action을 가진 프로그램 파일 지정 
 
 -F c                     # 필드 구별자(FS: Field Separator) 지정 
 
 'pattern {action}'    # awk program의 command 문장은 single quotes(' ') 또는 double quotes(" ")로 둘러싸여 있습니다.  
                             Input의 각 라인(Line)이 원하는 pattern과 일치하면, action 부분이 실행됩니다. 
                             action 없이 pattern만 있는 경우, 원하는 pattern을 찾으면 각 Input 라인을 그대로 출력합니다. 
                             pattern 없이 action만 있는 경우, Input의 각 라인에 대해 action을 실행합니다. 
                             action 부분은 항상 중괄호({})로 둘러싸여 있습니다. 
                             여러 action을 실행 시, action 사이를 세미콜론(;)이나 new-line 문자로 구분할 수 있습니다. 


▶ 패턴


$ cat Hello.txt
Hello, World!!
Be The Reds!! 
 
여기서 awk 명령을 이용하여 Hello 필드를 포함하고 있는 모든 레코드를 출력하기
위한 명령은 다음과 같습니다.  
 
$ awk '/Hello/' Hello.txt
Hello, World!! 




▶ 동작 = awk 명령어

함수호출, 변수값 지정, 산술계산과 이들 조합한 것 


* print 명령어 : 텍스트 출력

awk 에서 한 줄은 자동적으로 여러 개의 필드로 구분되어짐. 필드는 print 명령에서 따로따로 출력될 수 있음.


예시) 

$ awk '{ print $1 }' filename    # 현재 줄의 첫 번째 필드를 출력

$ awk '{ print $1, $3 }' filename    

# 첫 번째와 세 번째 필드를 출력, 둘 사이에는 디폴드로 빈칸(스페이스) 하나로 주어지는 OFS(출력 필드 구분자, output field seperator)가 들어감


$0 은 줄 정체를 지정함.  print print $0 은 똑같은 결과를 가져옴


print 계산의 결과함수호출의 결과값을 뿌릴 수도 있다.

{ print 3+4 }

{ print footbar(3) }


다른 파일로 씀.

{ print "expression" > "file name" }




예시)


awk 명령어

awk '/west/' datafile : west 라는 글이 있는 줄 출력
awk '/^north/' datafile : north로 시작하는 줄 출력
awk '/^(no | so)/' datafile : no 또는 so 로 시작하는 줄 출력
awk '{ print $3, $2 }' datafile : datafile 리스트의 세 번째 와 두 번째 필드를 스페이스로 띄어서 출력
awk '{ print $3 $2 }' datafile : datafile 리스트의 세 번째 와 두 번째 필드를 그냥 붙여서 출력 
awk '{ print "Number of fields : " NF} ' datafile : datafile의 각 줄마다의 필드수를 리턴한다.
awk '$5 ~ /\.[7-9]+/' datafile : 다섯 번째 필드가 마침표 다음엣 7과 9사이 숫자가 하나 이상 나오는 레코드 출력
awk '$2 !~ /E/ { print $1, $2 }' datafile : 두 번째 필드에 E 패턴이 없는 레코드의 첫 번째와 두 번째 필드 출력
awk '$3 ~ /^Joel/{ print $3 " is a nice guy."} ' datafile : 세 번째 필드가 Joel로 시작하면 " is a nice guy"와 함께 출력
awk '$8 ~ /[0-9][0-9]$/ { print $8 }' datafile : 여덟 번째 필드가 두 개의 숫자이면 그 필드가 출력
awk '$4 ~ /Chin$/ { print "The price is $" $8 "." }' datafile : 네 번째 필드가 Chine으로 끝나면 "The price is $" 8번 필드 및 마침표가 출력
awk -F: '{ print $1 } ' datafile : -F 옵션은 입력 필드를 ':'로 구별.
awk -F"[ :]" '{ print $1, $2 } ' datafile : 입력 필드로 스페이스와 ':'를 필드 구별자로 사용
awk -f awk_script.file datafile : -f 옵션은 awk 스크립트 파일 사용할 때 씀.

awk '$7 == 5' datafile : 7번 필드가 5와 같다면 출력
awk '$2 == "CT" { print $1, $2 }' datafile : 2번 필드가 "CT" 문자와 같으면 1, 2 번 필드 출력
awk '$7 < 5 { print $4, $7}' datafile : 7번 필드가 5보다 작다면 4번, 7번 필드 출력
awk '$6 > .9 { print $1, $6}' datafile : 6번 필드가 .9 보다 크다면 1번, 6번 출력
awk '$8 > 10 && $8 < 17 ' datafile 
awk '$2 == "NW" || $1 ~ /south/ { print $1, $2 }' datafile




출처 : 

위키백과

http://www.dreamy.pe.kr/zbxe/CodeClip/6332

http://slog2.egloos.com/v/3689816



'IT' 카테고리의 다른 글

[2018_03_27] 찾아본 것  (0) 2018.03.27
json  (0) 2018.03.21
python에서의 thread 동시성 문제 (feat. GIL, Global Interpreter Lock )  (0) 2018.02.08
Process와 Thread  (0) 2018.02.06
무료로 사용하기 좋은 웹 컴파일러와 개발환경  (0) 2018.02.05