본문 바로가기
리눅스

[로그분석 1] awk 기본사용법

by 파워킴 2021. 7. 13.
반응형

AWK ?

AWK(오크;Aho Weinberger Kernighan)는 유닉스에서 처음 개발된 일반 스크립트 언어이다. AWK의 기본 기능은 텍스트 형태로 되어있는 입력 데이터를 행과 단어 별로 처리해 출력하는 것이다. AWK라는 이름은 이 스크립트 언어를 만든 앨프리드 에이호, 피터 와인버거, 브라이언 커니핸 세 명의 성의 앞글자를 따서 붙여졌다.

 

* 위키피디아 참고 :  https://ko.wikipedia.org/wiki/AWK

 

awk 테스트를 위한 accesslog 샘플파일

* https://github.com/elastic/examples/blob/master/Common%20Data%20Formats/apache_logs/apache_logs 여기 있는 파일을 기준으로 테스트 및 예제진행.

apache_logs.txt
2.26MB

파일형식 : 

 

awk 구분자를 통한 요소 추출.

* -F"[구분자]" '{print $(요소의 순서)}' 

:  구분자인 공백문자를 기준으로 스트링을 split 하였으며 split 한 배열의 1번째 요소의 값을 추출한경우. 

* IP 만 추출. 

$ awk -F" " '{print $1}' apache_logs.txt

180.76.5.22
108.174.55.234
187.45.193.158
46.32.254.207

 

Request 경로만 추출. 

$awk -F" " '{print $7}' apache_logs.txt

/presentations/logstash-puppetconf-2012/images/logs.jpg
/presentations/logstash-puppetconf-2012/images/apache-negative-duration.png
/favicon.ico
/blog/tags/xsendevent
/blog/geekery/disabling-battery-in-ubuntu-vms.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29
/blog/geekery/solving-good-or-bad-problems.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29
/projects/xdotool/
/blog/tags/standards
/blog/tags/puppet?flav=rss20
/blog/geekery/solving-good-or-bad-problems.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29
/?flav=atom
/robots.txt
/blog/tags/puppet?flav=rss20

 

awk 조건에 따른 출력 (IF)

* 특정시간대의 로그 추출 

$awk -F" " '{ if ($4="20/May/2015:21:05") print $0 }' apache_logs.txt

83.149.9.216 - - 20/May/2015:21:05 +0000] "GET /presentations/logstash-monitorama-2013/css/print/paper.css HTTP/1.1" 200 4254 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gec
ko) Chrome/32.0.1700.77 Safari/537.36"
83.149.9.216 - - 20/May/2015:21:05 +0000] "GET /presentations/logstash-monitorama-2013/images/1983_delorean_dmc-12-pic-38289.jpeg HTTP/1.1" 200 220562 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKi
t/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
83.149.9.216 - - 20/May/2015:21:05 +0000] "GET /presentations/logstash-monitorama-2013/images/simple-inputs-filters-outputs.jpg HTTP/1.1" 200 1168622 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
83.149.9.216 - - 20/May/2015:21:05 +0000] "GET /presentations/logstash-monitorama-2013/images/tiered-outputs-to-inputs.jpg HTTP/1.1" 200 1079983 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.
36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
83.149.9.216 - - 20/May/2015:21:05 +0000] "GET /favicon.ico HTTP/1.1" 200 3638 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
24.236.252.67 - - 20/May/2015:21:05 +0000] "GET /favicon.ico HTTP/1.1" 200 3638 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0"
93.114.45.13 - - 20/May/2015:21:05 +0000] "GET /articles/dynamic-dns-with-dhcp/ HTTP/1.1" 200 18848 "http://www.google.ro/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CCwQFjAB&url=http%3A%2F%2Fwww.semicomplete.com%2Farticles%2Fdynamic-dns-with-dhcp%2F&ei=W88AU4n9HOq60QXbv4G
wBg&usg=AFQjCNEF1X4Rs52UYQyLiySTQxa97ozM4g&bvm=bv.61535280,d.d2k" "Mozilla/5.0 (X11; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0"

 

awk FOR 문으로 그룹 count 

* 특정ip 가 몇번 호출 되었는가를 ARRAY에 담아 그룹 count 처리. 

$awk -F" " '{array[$1]+=1} END { for(i in array) { print array[i] "\t" i}}' apache_logs.txt | sort -n

50      14.160.65.22
50      86.76.247.183
52      50.139.66.106
56      66.249.73.185
60      208.91.156.11
60      65.55.213.73
65      108.171.116.194
74      208.115.113.88
82      198.46.149.143
83      208.115.111.72
84      100.43.83.137
99      68.180.224.225
102     209.85.238.199
113     50.16.19.13
273     75.97.9.59
357     130.237.218.86
364     46.105.14.53
482     66.249.73.135

 

마무리

 

awk 에는 다양한 옵션과 명령이 존재 하지만 다 외우고 사용하기 힘들다...

가장 기본적으로 사용하는 것들을 잘 이용하면 웬만한건 다된다...

 

안되는건 grep과 혼용하여 사용. 

 

 

[log 분석 2] <==

반응형

댓글