메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

AWK 입문

한빛미디어

|

2003-10-22

|

by HANBIT

10,553

저자: 정원희 (유엔젤㈜ 무선인터넷 서비스사업팀/freesoft at nownuri.net)

AWK가 뭐하는 거냐고 묻는다면, 간단하게 텍스트에서 원하는 결과들을 추려내고 정리해서, 원하는 형태의 결과물 텍스트를 만들고자 할 때 사용하는 툴이라고 말할 수 있을 것이다. 물론 펄(Perl)도 있지만 AWK 역시 대부분의 유닉스에 펄만큼이나 보편적으로 설치되어 있으며 아직까지 널리 사용되고 있다. 간단히 AWK를 소개하는 기사인 만큼, 너무 기본적이거나 복잡한 것들은 과감히 생략하고 독자들이 AWK에 관심을 가질 수 있도록 실습 가능한 흥미위주의 내용들을 몇 가지 다루어 볼까 한다.

일반적인 awk 의 사용법은 일반적으로 다음과 같은 형식이다.
awk  {}
정규 표현식 완전 해부와 실습(개정판)


search pattern은 어떤 조건을 찾을 것인지를 기술하면 되는데, 정규표현식(regular expression)을 이용하면 된다. 검색조건은 생략할 수 있으며 이때는 모든 입력값이 처리대상이 된다. 정규표현식에 대해서 생소한 독자라면 『정규 표현식 완전 해부와 실습(개정판)』이나 『Regular Expression Pocket Reference』를 참고하기 바란다(한빛미디어에 기고하는 기사라서가 아니라 시중에 출간된 책 중에 정규표현식을 다루는 참고할만한 서적이 별로 없다).

이제부터는 독자들이 개인 또는 회사에서 아파치 웹 서버를 관리한다고 가정하고 기사를 진행해 보도록하겠다. 웹 서버의 응답속도가 느리다거나 뭔가 문제가 발생했다고 할 때, 기본적으로 스크립트를 약간 할 줄 안다면 보통 아파치 웹 서버 데몬을 찾을 때 다음과 같이 할 것이다.
ps -ef | grep httpd
이러면 ps -ef의 한 결과 중 httpd가 포함된 정보들이 주루룩 나올 것이다. 이는 awk를 이용해서 다음과 같이 할 수 있다.
ps -ef | awk "/httpd/ {print}"
혹은
ps -ef | awk "/httpd/ {print $0}"
$0 은 입력라인 전체를 의미한다.

단지 이것이 전부라면 awk를 이용할 필요가 전혀 없을 것이다. ps -ef의 결과 중 필요한 필드만을 취사선택해서 나타내고 싶다고 하자. 물론 ps 옵션을 수정해서 그렇게 나타내 보일 수도 있지만, 우리는 이것을 awk로 해보기로 하겠다. 왜? awk 입문을 위한 기사니까… 보통 ps -ef 를 하면 다음의 순서로 결과가 나온다.
UID         PID   PPID    C STIME    TTY             TIME CMD
이렇게 칸이 띄워져 있는 텍스트의 한 라인을 awk에 입력하면 awk는 띄워 쓰기 기준으로 각 토큰들을 $1, $2, $3 … 의 식으로 인식한다. 다음과 같은 문장이 입력된다면
1  철수  초등학생  10세
Awk 는 공백을 기준으로 토큰을 잘라내서 "1"은 $1, "철수" 는 $2, "초등학생" 은 $3, 그리고 "10세"는 $4와 같은 식으로 사용할 수 있다. 만약 ps -ef 의 결과 중 UID와 C만 출력하고 싶다면
ps -ef | awk "/httpd/ {print $1, $4}"
이와 같이 입력하면 된다. AWK에서는 BEGIN과 END를 이용해서 변수의 선언을 비롯한 초기화, 그리고 모든 처리가 끝났을 때 수행할 동작을 지정할 수 있다. httpd들의 UID, PID, C 필드를 출력하고, 마지막에 C필드들의 합(CPU의 사용시간)을 출력해 보고 싶다면 다음과 같이 입력한다.
ps -ef | awk "/httpd/ {print $1, $2, $4; sum += $4} END {print "sum = ", sum}"
Regular Expression Pocket Reference
다음과 같은 식으로 결과가 나온다.
test4 24473 0.5
test4 24474 0.1
test4 24475 0.7
test4 24476 2.0
test4 24477 0.0
test4 26306 0.0
web1 87796 1.0
web1l 87800 10.0
web1 88186 0.0
web1 127437 0.0
web1 314856 0.0
sum =  14.3
awk로 처리해야 할 파일이 | 와 같이 파이프로 제공되지 않고 특정파일로 제공된다면 awk 뒤에 파일명을 적어주면 된다. test.txt 를 읽어서 뭔가를 처리하고 싶다면 다음과 같이 입력해주면 된다.
awk   "program_text"    test.txt
awk에서도 다른 유틸리티나 프로그래밍 언어와 같이 조건문을 제공한다. CPU 사용시간이 1이상인 프로세스들을 출력하고 그 합을 보고 싶다면 다음과 같은 형식으로 해주면 된다.
ps -ef | awk "/httpd/ {if ($4 >= 1) print $1, $2, $4; sum += $4} END {print "sum = ", sum}"
이번 기사에서는 간단하게 AWK를 소개하는 정도의 기사를 적어보았다. 다음에 시간이 허락된다면, 좀 더 복잡한 사용법과 함께 Awk와 함께 자주 사용되는 Sed에 대해서도 소개해 볼까한다.
기사내용과 상이한 동작을 발견하신 분, 혹은 질문사항이 계신 분들은 freesoft at nownuri.net로 메일 주시기 바랍니다.
TAG :
댓글 입력
자료실