• AWK 2010.07.19 1
반응형

참조 사이트 : http://www.ibm.com/developerworks/linux/library/l-awk1.html
http://www.ibm.com/developerworks/linux/library/l-awk2.html
http://www.ibm.com/developerworks/linux/library/l-awk3.html


AWK(오크) 시작하기

아래의 두개의 명령은 동일한 일을 합니다.

$ cat 명령을 통해 /etc/passwd 파일을 본뒤 실행해 보세요

 $ awk '{ print }' /etc/passwd

 $ awk '{ print $0 }' /etc/passwd

print 와 print $0 의 명령은 전체 라인을 나타내는 표현입니다.

다음 명령은 입력과 상관없이 출력을 할 때 사용한다.

$ awk '{ print "" }' /etc/passwd

이 명령은 빈공간을 출력한다. (입력되는 /etc/passwd 파일의 내용과는 상관없이)

$ awk '{ print "hiya" }' /etc/passwd

위 명령 또한 입력되는 /etc/passwd 파일과는 상관없이 hiya 내용만 출력될 것이다. (전체 /etc/passwd파일의 라인수 만큼 )




- 여러 필드들

awk는 텍스트들을 여러개의 논리적 필드로 문자열들을 조작하기에 아주 좋습니다.

당신의 awk script 안에서 부터 각각의 필드들을 손쉬게 조작할 수 있습니다.

다음의 스크립드는 당신의 시스템으로부터 유터들의 정보를 출력합니다.

 $ awk -F":" '{ print $1 }' /etc/passwd

-F 옵션은 : 문자열로 구분하여 필드를 분리합니다.  /etc/passwd 파일에서 : 구분자로 구분된 $1 (첫번째) 값을 출력합니다.

즉, root:x:0:0:root:/root:/bin/bash 와 같은 첫번째 입력값으로 부터 : 구분자로 분리한 첫번째 값 root 가 출력됩니다.

또다른 예제를 보자

 $ awk -F":" '{ print $1 $3 }' /etc/passwd

출력 결과는 다음과 같다

 halt7
operator11
root0
shutdown6
sync5
bin1
....etc.

/etc/passwd의 첫번째와 세번째 필드값(사용자 이름 필드와 uid 필드값을 )을 AWK가 출력하는것을 볼수 있다.

스크립트 작업결과 두 개의 필드값 사이에 공백이 없어 완벽하지 않다.

다음의 명령은 두개의 필드 사이에 공백을 넣는다.

 $ awk -F":" '{ print $1 " " $3 }' /etc/passwd

" " 공백 두개로 print를 사용해 문자를 연결 할 수 있고, 만약 필요하다면 다음과 같이 어떤 문자를 넣을 수도 있다.

 $ awk -F":" '{ print "username: " $1 "\t\tuid:" $3" }' /etc/passwd

출력 결과는 다음과 같다 (\t 는 탭 명령이다.)

username: halt          uid:7
username: operator   uid:11
username: root         uid:0
username: shutdown uid:6
username: sync        uid:5
username: bin           uid:1
....etc.




- 예제 스크립트들

간단한 명령은 awk 스크립트를 사용하지 않아도 되지만, 복잡하거나 규모가 있는 경우에는 별도의 script 파일로 분리가 가능하다.
또한 그 파일로 script를 실행하려면 -f 옵션을 사용한다.

 $ awk -f myscript.awk myfile.in

myscript.awk 파일
- : 으로 구분된 첫번째 필드값을 myfile.in (입력파일에서 라인별로 구분하여)으로 부터 출력한다.

 BEGIN {
        FS=":"
}
{ print $1 }

필드구분하는 두가지 방법이 있다.  이 파일에서는 FS 변수를 선언함으로서 필드를 구분하였다.

이전 방법은 명령줄 옵션에서 -F ":" 를 사용했었다.




- BEGIN 과 END 블럭

일반적으로 각각의 입력 라인으로부터 당신의 scripts는 코드는 각각의 블럭으로 실행된다.

그렇지만, 입력 파일로 부터 awk 프로세싱이 시작하기 전에 실행해야할 초기 코드들이 필요한 많은 프로그래밍 상황이 있다.

그런 상황에서 awk는 BEGIN 블럭을 정의함으로서 허용할 수 있다.

우리는 이전 예제에서 BEGIN 블럭을 사용했었다. 

FS 변수를 초기화 하거나, 머리글을 출력하거나, 다른 전체 변수를 초기화하거나 나중에 프로그램에서 언급하겠지만 초기화하기에 우수하다.

또한 AWK는 다른 block를 제공하며 END 블럭이라 한다.

입력된 모든 파일의 라인들이 처리되고 나서 AWK는 이 블럭을 실행한다.

전형적으로 END 블럭은 마지막 계산수행 또는 마지막 출력을 나타내야 할때 사용된다.




- 정규 표현과 블럭들

작성중...
반응형

+ Recent posts