콘텐츠로 건너뛰기

awk를 이용한 웹서버 로그 분석

0) prologue

1) awk는 ?
: 설계자인 Aho, Weingrger, Kernighan 의 첫 글자로 명명되어진 인터프리터 프로그래밍 언어이다.
필터링, 치환, 간단한 리포팅 작업을 할 수 있어서 편리하다.
화면에 출력되는 내용을 열로 나누어 특정열만 뽑아내는 명령이다.(explode와 비슷)

2) awk의 형식 ?
: BEGIN { … } /Pattern Statement/ {action} END { … }
먼저 실행되는 부분인 BEGIN, 우리가 처리하고자 하는 작업 부분,
그리고 프로그램을 종료할 때 쓰는 END로 이루어져 있다.

awk [옵션] ‘스크립트’ [-v 변수=값] [파일(들)]
awk [옵션] -f 스크립트 파일 [-v 변수=값] [파일(들)]

-Fc : field separator 지정
Fc는 필드 사이를 구분하는 구분자이다
직접 지정하지 않으면 공백을 기준으로 한다
시스템 변수 FS를 지정하는 것과 같은 효과를 지닌다

-v 변수 = 값
스크립트를 실행하기 전에 미리 변수를 지정하여 준다
$를 쓰지 않고 변수 이름만 쓰면 된다. C에서 #define처럼 생각하면 될 것이다.

-f 스크립트 파일
스크립트를 파일에서 가져온다
-f 옵션을 여러번 사용하여 여러개 스크립트 파일을 동시에 불러와 지정한 파일에 적용할 수 있다

3) 필드 ?
: 입력된 각 레코드에서 공백 문자로 구분되는 데이터들을 말한다.
각각은 $n으로 표시되며, 전체 필드는 $0이다.

4) 자주 사용하는 함수 ?
: length = 주어진 문자열의 문자 개수를 리턴한다.
substr = 지정한 문자열에서 원하는 개수 만큼의 문자를 추출하여 리턴한다.
index = 문자열에서 지정하는 문자열이 있는 위치를 나타낸다.

5) 제어문, 연산자 ?
: for, while, if, break, continue, next, exit

6) 정규화 패턴 ?
: /…/ 의 형식을 가짐 (ex. /^[0-9]+$/)
/패턴/ {동작}
커맨드 라인에서는 패턴, 동작 전체를 단일 따옴표로 묶는다
패턴만 있는 경우 : 패턴과 일치하는 레코드(라인)를 화면에 출력한다
동작만 있는 경우 : 모든 레코드(라인)가 동작의 대상이 된다

7) 동작 ?
동작은 모두 { }로 둘러싸야 한다
good이라는 문자열을 포함하는 모든 레코드를 출력할 때 /good/
각 레코드의 첫 번째 필드를 출력할 때 { print $1 }
good이라는 문자열을 포함하는 레코드의 첫 번째 필드를 출력할 때 /good/ { print $1 }
두 개 이상의 필드를 가지는 레코드를 전부 출력할 때(비교연산) NF > 2
한 라인(\n)을 필드로, 빈 라인(“”)을 레코드로 구분할 때 BEGIN { FS = “\n” ; RS = “”}
첫 번째 필드가 good와 일치하는 레코드에 대해 세 번째 필드를 먼저 출력하고 두 번째 필드를
나중에 출력하고 싶을 때 $1 ~ /good/ { print $3 , $2 }
good이라는 문자열이 몇 개나 들어가 있는지 계산하여 마지막 부분에서 출력하고 싶을 때
/good/ { ++x } END { print x }
두 번째 필드를 모두 합하고 마지막 부분에서 두 번째 필드의 총합계를 출력하고 싶을 때
{ total += $2 } END { print “Total of $2: ” , total }
레코드의 길이가 20자 이하인 것을 출력하고 싶을 때 length($0) < 20
네 개의 필드를 가지며 good이라는 단어로 시작하는 모든 레코드를 출력하고 싶을 때 NF == 4 && /^good/
빈줄을 제외한 모든 줄을 화면에 출력한다 NF > 0

8) 변수 ?

: NR 레코드수, NF 필드수, FS 필드구분문자, RS 레코드구분문자, FILENAME 현재파일이름

9) 출력 ?

: print, printf, sprintf

ex)

awk ‘BEGIN {print “begin”}; {print “statement”} END {print “end”}’ [FILENAME]

awk ‘ BEGIN { for (i = 1;i<=7,i++) print int(101*rand()) }’
: 화면에 1이상 100이하의 난수 일곱 개를 출력한다

ls -l [FILE1] [FILE2] [FILE3] | awk ‘ { x += $5 } ; END { print “Total bytes : ” x } ‘
: 파일들의 크기를 모두 합하여 총 바이트 수를 표시한다

awk ‘ END { print NR } ‘ [FILENAME]
: 지정한 파일의 라인이 몇 개인지를 표시한다

awk ‘ NR % 2 == 0 ‘ [FILENAME]
: 지정한 파일의 짝수번째의 라인만을 출력해 준다

적용)

tail -f [FILENAME] | awk ‘BEGIN {print “start”} ($9 == 500) {print $0} END {print “end”}’;
: FILENAME을 읽어서 http응답이 500인 것만 찾아서 출력한다.

tail -f [APACHE LOG] | awk ‘($9 != 200 && $9 != 302 && $9 != 304) {print $0}’;
: APACHE LOG를 읽어서 비정상적인 응답을 찾는다.

tail -f [TOMCAT LOG] | awk ‘/ERROR/ {print $0}’;
: TOMCAT LOG를 읽어서 오류인 부분을 찾는다.

ps -aux | awk ‘/httpd/ {printf “cpu usage:%.1f memory usage:%.1f\n”, $3, $4}’
: httpd가 사용하는 리소스를 알아본다.

“awk를 이용한 웹서버 로그 분석”의 5개의 댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다