読者です 読者をやめる 読者になる 読者になる

F@N Ad-Tech Blog

株式会社ファンコミュニケーションズ nend・nex8のエンジニア・技術ブログ

sedやらawkでログ調査を行う

apache awk CentOS grep Linux sed ターミナル

はじめまして。ADN事業部サーバサイドチームのy_ouchiです。

みなさんは先月末のSAYONARA国立競技場はご覧になったでしょうか?

エンジニアのみなさまなら当然ブルーインパルスを見に行ったと思いますが、私の場合は当日の朝起きたらすでに夕方だったので、自宅から3分の展望台でデジカメを構えておりました。

結果はご覧のとおり飛行機雲が頭上を通りました。果報は寝て待てですね。

IMGP0109-2

さて、今回障害調査のためにLinuxサーバのログを調べる必要があったのですが肝心のLinuxコマンドがなかなか出てこず悩んでしまったのでそのメモです。 ログの調査はgrepさえあればなんとか(?)なるものですが、やはり緊急時を考えるとそれだけでは大変です。 sed, awk は一家に一台あると安心たこ焼き器のようなもので、いつでも使えるようにしておくと急な来客(障害)にも安心です。

今日はこんなログサンプルをご用意してみました。実際のログは長大と思われますので、適宜headやlessにパイプしながら確認しましょう。 環境はCentOSですが、一般的なLinux環境なら動作すると思います。 [html] $ cat access.log 192.168.11.10 - - [10/Jun/2014:00:00:41 +0900] "GET /contents/371625 HTTP/1.0" 200 17724 "http://example.com/index/29230" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36 OPR/22.0.1471.50" "-" "-" "-" 192.168.10.20 - - [10/Jun/2014:02:01:53 +0900] "GET /tag/29349 HTTP/1.1" 302 20 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53" "-" "-" "-" 192.168.11.10 - - [10/Jun/2014:04:07:09 +0900] "GET /media HTTP/1.1" 200 3745 "http://example.net/index?page=5" "Mozilla/5.0 (Linux; Android 4.1.1; HTL21 Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36" "-" "-" "-" 192.168.11.11 - - [10/Jun/2014:05:33:30 +0900] "POST /form/getcontent HTTP/1.1" 200 562 "http://example.net/form/index" "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0" "-" "-" "-" 192.168.10.20 - - [10/Jun/2014:06:37:12 +0900] "GET /faq/index HTTP/1.1" 200 8144 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en)" "-" "-" "-" 192.168.10.20 - - [10/Jun/2014:07:45:37 +0900] "GET /login HTTP/1.1" 200 3197 "-" "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D201 Safari/9537.53" "-" "-" "-" [/html]

IPアドレスごとの件数を件数を出力してみます。 ここの awkは cut -f コマンドで大丈夫なのでまだ有り難みがありませんね。 [html] $ cat access.log | awk '{print $1}' | sort | uniq -c 3 192.168.10.20 2 192.168.11.10 1 192.168.11.11 [/html]
これだと実際のログでは大変なことになるので、sedで第3オクテットまで切り出してみます。 [html] $ cat access.log | awk '{print $1}' | sed "s/.[0-9]$//" | sort | uniq -c 3 192.168.10 3 192.168.11 [/html]
次にAndroidからのアクセスのみgrepしてみます。基本ですね。 [html] $ cat access.log | grep Android 192.168.11.10 - - [10/Jun/2014:04:07:09 +0900] "GET /media HTTP/1.1" 200 3745 "http://example.net/index?page=5" "Mozilla/5.0 (Linux; Android 4.1.1; HTL21 Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36" "-" "-" "-" [/html]
awkは条件分岐を記述できるので、特定の行のみを処理することもできます。
最初にAndroidからアクセスがあった以降のすべてのログを出力。 [html] $ cat access.log | awk 'BEGIN{flag=0}{if($0~"Android")flag=1;if(flag==1)print $0}' 192.168.11.10 - - [10/Jun/2014:04:07:09 +0900] "GET /media HTTP/1.1" 200 3745 "http://example.net/index?page=5" "Mozilla/5.0 (Linux; Android 4.1.1; HTL21 Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36" "-" "-" "-" 192.168.11.11 - - [10/Jun/2014:05:33:30 +0900] "POST /form/getcontent HTTP/1.1" 200 562 "http://example.net/form/index" "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0" "-" "-" "-" 192.168.10.20 - - [10/Jun/2014:06:37:12 +0900] "GET /faq/index HTTP/1.1" 200 8144 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en)" "-" "-" "-" 192.168.10.20 - - [10/Jun/2014:07:45:37 +0900] "GET /login HTTP/1.1" 200 3197 "-" "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D201 Safari/9537.53" "-" "-" "-" [/html]
awkは処理するフィールドを $1 ~ で指定できますが、このログの場合 12番目以降がユーザエージェントになるのでそれを切り出してみます。 $12以降をprintfで出力し、最後の2回のsedで前後のダブルクォーテーションを削除しています。 [html] $ cat access.log | awk '{for(i=0; i<NF; i++){if(i>=12)printf $i " ";if(i==NF-1){print ""}}}' | sed 's/^"//' | sed 's/".
$//' Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36 OPR/22.0.1471.50 Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53 Mozilla/5.0 (Linux; Android 4.1.1; HTL21 Build/JRO03C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Mobile Safari/537.36 Mozilla/5.0 (Windows NT 6.2; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Mozilla/5.0 (iPod touch; CPU iPhone OS 7_1_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D201 Safari/9537.53 [/html]

sed, awk1冊の本 になるほど多機能なコマンドですが、あまり凝ったものを使っていると自分でも何をするコマンドかわからなくなったり、あるいはいざ使うときに忘れていたりと、(私のように)困ったことになるかもしれません。 用法・用量を守ってお使いください。