데브로맨스
【 gawk 】 본문
>목차
개념
- UNIX 에서 사용되던 awk 프로그램의 GNU 버전
배경
- 문자열 및 바이너리 데이터 스트림 수정 및 재구성할 수 있는 좀 더 프로그래밍에 가까운 환경을 제공하는 고급 문자열 데이터 조작 툴이 필요하게 되어 등장
기능
- 데이터를 저장하는 변수 정의
- 데이터를 다루기 위한 산술 및 문자열 연산자 사용
- 조건문 및 반복문과 같이 데이터 처리에 로직을 추가하는 구조적 프로그래밍 개념 사용
- 데이터 파일 안에서 데이터 요소를 추출하고 다른 순서 또는 형식으로 재구성하여 형식화된 보고서 생성
동작
- sed 편집기처럼 문자열 데이터 스트림에서 사용할 수 있는 텍스트의 각 줄에 대해 프로그램 스크립트를 실행
- 버퍼 관리 ( Buffer Operation )
장/단점
특징
문법
【 문법 】
gawk 【-options】 【'BEGIN { script; script; ... } { script; script; ... } END { script; script; ... } '】 |
|
option(s) | -F, -f, -var, -mf, -mr, -W. -b |
'{script; ... }' | script 를 하나의 문자열로 가정하기 때문에 홑다옴표로 묶어야 한다. script 명령은 두 중괄호 사이에 있어야 한다. 여러 개의 명령을 수행하고 싶을 때는 각 명령 사이에 세미콜론을 넣어주면 된다. |
BEGIN { ... } | 데이터 스트림을 처리하기 전에 스크립트 명령 실행하기 |
END { ... } | 데이터 스트림을 처리한 후 스크립트 명령 실행하기 |
【 변수 】
설명 | |
변수 참조 | 변수의 값을 참조할 때 달러 ( $ ) 기호를 사용하지 않는다. |
【 옵션 】
옵션 | 설명 |
-F fs | 한 줄에서 데이터 필드의 경계를 식별하기 위한 파일 구분자를 지정한다. |
-f file | 프로그램이 읽어 들일 파일 이름을 지정한다. |
-var=value | gawk 프로그램에서 사용할 변수의 기본 값을 정의한다. |
-mf N | 데이터 파일에서 처리할 필드의 최대 수를 지정한다. |
-mr N | 데이터 파일의 최대 레코드 크기를 지정한다. |
-W keyword | gawk 의 호환성 모드 또는 경고 수준을 지정한다. |
-b | 바이너리 데이터를 다룰 수 있다. |
【 명령 】
- 여러 명령을 사용하려면 각 명령 사이에 세미콜론 ';' 을 넣으면 된다.
명령 | 설명 |
표준 출력 ( STDOUT ) 으로 문자 ( 열 ) 를 출력한다. |
【 데이터 필드 변수 】
- 입력받은 문자(열) 데이터 스트림에서 검출된 각 문자(열) 데이터 필드에 다음 변수를 대입한다.
- 한 줄 안에서 각 데이터 필드는 필드 구분자로 결정된다.
- 문자열 한 줄을 읽을 때 이 줄은 지정된 필드 구분자를 사용해서 각 데이터 필드로 구분된다.
- 기본 필드 구분자는 '화이트 스페이스 문자 ( 탭 or 빈 칸 )'다.
필드 변수 | 설명 |
$0 | 텍스트의 전체 줄 |
$1 | 텍스트의 줄에서 첫 번째 데이터 필드 |
$2 | 텍스트의 줄에서 두 번째 데이터 필드 |
$n | 텍스트의 줄에서 n 번째 데이터 필드 |
예제 - Command-LIne 에서 프로그램 스크립트 읽기
$ gawk '{print "Hi"}' // exam 1)
>
$ $ gawk '{print "Hi"}' // exam 2)
> This is a test
Hi
> hello
Hi
> This is another test
Hi
「 첫 번째 예제에서, 이 명령을 실행하면 아무 일도 일어나지 않고 입력받기 위해 대기한다. 입력 파일을 지정을 하지 않았기 때문에 표준 입력 ( STDIN ) 으로부터 데이터 스트림을 받기 위해 대기한다. 두 번째 예제처럼 대기 상태에서 키보드 입력으로부터 문자열 데이터 스트림을 \n 까지 한 줄 받고 나면 print 명령을 수행하게 되어 "Hi" 가 표준 출력으로 보내지게 되어 모니터에 출력된다. gawk 프로그램을 종료하려면 데이터 스트림이 종료되었다는 신호 ( EOF 문자 입력 ) 를 보내야 하는데, bash 에서 < Ctrl > + < D > 키 조합은 EOF 문자를 만들어 낸다. 이 신호를 받고나면 프로그램은 종료된다. 」
예제 - 데이터 필드 사용하기
$ cat data.txt
ONe line of test text.
Two lines of test text.
Three lines of test txt.
$
$ gawk '{print $1}' data.txt // exam 1)
One
Two
Three
$ gawk -F: '{print $1}' /etc/passwd // exam2)
root
bin
daemon
[ ... ]
「 첫 번째 예제는, 텍스트의 각 줄에 있는 문자열에서 첫 번째 데이터 필드만을 표시하기 위해 $1 로 필드 변수를 사용한다. 두 번째 예제는 -F 옵션으로 콜론 ':'을 필드 구분자로 지정하여 텍스트의 각 줄에 있는 문자열을 분리하여 첫 번째 데이터 필드만을 표준 출력을 통해 모니터로 출력한다. 」
예제 - 프로그램 스크립트에서 여러 명령 사용하기
$ echo "My name is Rich" | gawk '{$4="Christine"; print $0}' // exam 1)
My name is Christine
$ gawk '{ // exam 2)
> $4="Christine"
> print $0}'
My name is Rich
My name is Christine
「 첫 번째 예제는, 표준 입력 ( STDIN ) 으로부터 입력된 문자열 데이터 스트림에서 4번째 필드 문자열을 치환 후 줄 전체를 표준 출력 ( STDOUT ) 을 통해 모니터로 출력한다. 두 번째 예제는, 한 번에 하나의 스크립트 명령을 입력할 수 있도록 보조 프롬프트를 사용한다. 표준 입력을 통해 들어오는 문자열 데이터 스트림에 명령을 수행하며 종료를 하고 싶을 때는 데이터 스트림의 끝을 알리는 Ctrl + D 키 조합을 누른다. 」
예제 - 파일로부터 프로그램 읽기
$ cat script.gawk
{print $1 "'s home directory is " $6}
$
$ gawk -F: -f script.gawk /etc/passwd exam 1)
root's home directory is /root
bin's home directory is /bin
[ ... ]
$ cat script.gawk
{
test = "'s home directory is "
print $1 text $6
}
$ gawk -F: -f script.gawk /etc/passwd // exam 2)
root's home directory is /root
bin's home directory is /bin
[ ... ]
「 첫 번째 예제는, 텍스트 파일에 작성한 스크립트 명령을 읽어 와서 수행한다. /etc/passwd 에서 새줄 문자 ( newline ) 로 구분된 문자열 데이터 스크림을 한 줄 읽어 들여 -F 로 지정한 구분 문자로 필드를 나눈 후 첫 번째 필드와 여섯 번째 필드를 표준 출력 ( STDOUT ) 으로 보내 모니터로 출력한다. 두 번째 예제는, text 변수에 문자열을 저장하고 변수에 저장된 값을 참조하여 $1, $6 필드의 문자열과 함께 결과 값을 출력한다. 」
예제 - 데이터를 처리하기 전에 스크립트 실행하기
$ gawk 'BEGIN {print "Hello World!"}' // exam 1)
Hello World!
$ cat data.txt
Line 1
Line 2
Line 3
$
$ gawk ' BEGIN {print "The data File Contents:"} // exam 2)
> {print $0}' data.txt'
The data File Contents:
Line 1
Line 2
Line 3
「 이 예제를 통해 알수 있는 건, 문자열 데이터 스트림을 입력 받기 전에 BEGIN 에서 지정한 스크립트 명령을 먼저 딱 한번 수핸다는 것을 알 수 있다. 」
예제 - 데이터를 처리한 후 스크립트 실행하기
$ gawk 'BEGIN {print "The data File Contents:"}
> {print $0}
> END {print "End of File"}' data.txt
The data File Contents:
Line 1
Line 2
LIne 3
End of File
「 이 예제를 통해 알 수 있는 건, BEGIN 과 마찬가지로 문자열 데이터 스트림을 모두 입력 받은 후 END 에서 지정한 스크립트 명령을 딱 한번 수행한다. 」
예제
$ cat script.gawk
BEGIN {
print "The latest list of users and shells"
print " UserID \t Shell"
print "-------- \t --------"
FS=":"
}
{
print $1 " -t " $7
}
END {
print "This concludes the listing"
}
$
$ gawk -f script.gawk /etc/passwd
The latest list of users and shells
UserID Shell
-------- --------
root /bin/bash
[ ... ]
「 이 예제에서 알 수 있는 것은, FS 라는 특별한 변수를 정의한 것을 볼 수 있다. 이는 필드 구분자를 정의하는 또 다른 방법이다. 이 방법을 쓰면 스크립트 사용자가 Command-Line 에 필드 구분자를 정의할 필요가 없다. 」
고급