awk(오크)
패턴 탐색과 처리를 위한 명령어. 필드 단위의 패턴을 처리하는 언어(field-oriented pattern)이다.
입력으로부터 한 줄씩 읽어서 정규 표현식으로 조건이 맞는지 검사하고 판명되면 그 줄에 대해 명령어를 실행한다.
유닉스에서 처음 개발된 일반 스크립트 언어.문자열 데이터와 배열, 정규표현식을 주로 사용됨.
* 스크립트 언어 : 컴퓨터 프로그래밍 언어로써 응용SW를 말함. 매우 빠르게 배우고 작성하기 위해 고안되었으며 상대적으로 단순한 구문과 의미를 내포함.
1. awk 프로그램 구조
/패턴/ { 동작 }
$ awk '/pattern/' filename { 동작 }
패턴 : 정규 표현식
동작 : 실행명령
awk는 입력파일을 처음부터 한 줄씩 입력받아 주어진 패턴과 일치하는 줄을 찾으면 그 줄에서 동작에 해당하는 명령을 실행한다.
BEGIN { 동작 } # 입력을 읽기 전에 주어진 '동작'을 먼저 실행
END { 액션 } # 입력을 모두 훑고 마지막에 주어진 '액션'을 실행
/패턴/ # '패턴'에 일치하는 줄을 출력
{ 동작 } # 매 줄을 읽을 때마다 '동작'을 실행
-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 |