awkでApacheログを集計


はじめに


最近、業務で数十万行とあるapacheログを集計する作業をしまして、awkを使ったのでやったことメモします。今回は、awkを使ってリクエストされた特定の時間帯のみに絞るということをやってみます。

やること

  • 2019/1/21の22:00 ~ 23:00のログだけを出力する

ログ

164.90.44.151 - - [21/Jan/2019:21:58:46 +0900] "GET /category/garden HTTP/1.1" 200 42 "-" "Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"
20.51.178.81 - - [21/Jan/2019:21:58:47 +0900] "GET /item/software/2371 HTTP/1.1" 200 72 "/category/jewelry" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"
164.123.28.70 - - [21/Jan/2019:21:58:48 +0900] "GET /item/cameras/2173 HTTP/1.1" 200 53 "/search/?c=Cameras" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"
176.135.200.154 - - [21/Jan/2019:21:58:49 +0900] "GET /item/health/422 HTTP/1.1" 200 78 "/search/?c=Health+Toys" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
136.216.226.37 - - [21/Jan/2019:22:00:01 +0900] "GET /item/games/2213 HTTP/1.1" 200 66 "/category/games" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11"
204.192.114.210 - - [21/Jan/2019:22:00:51 +0900] "GET /item/office/3336 HTTP/1.1" 200 76 "/category/garden" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
112.180.144.50 - - [21/Jan/2019:22:58:52 +0900] "GET /category/music HTTP/1.1" 200 128 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7"
52.51.120.85 - - [21/Jan/2019:23:58:53 +0900] "GET /item/games/4598 HTTP/1.1" 200 56 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"
64.183.140.41 - - [21/Jan/2019:23:58:54 +0900] "GET /category/software HTTP/1.1" 200 102 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; YTB730; GTB7.2; EasyBits GO v1.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)"
124.123.194.54 - - [21/Jan/2019:23:58:55 +0900] "POST /search/?c=Office+Games HTTP/1.1" 200 101 "/item/books/2112" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; YTB730; GTB7.2; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; Media Center PC 6.0)"

コマンド

$ cat access_log | awk '"[21/Jan/2019:22:00:00" <= $4 && $4 < "[21/Jan/2019:23:00:00"'

実行結果

136.216.226.37 - - [21/Jan/2019:22:00:01 +0900] "GET /item/games/2213 HTTP/1.1" 200 66 "/category/games" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11"
204.192.114.210 - - [21/Jan/2019:22:00:51 +0900] "GET /item/office/3336 HTTP/1.1" 200 76 "/category/garden" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
112.180.144.50 - - [21/Jan/2019:22:58:52 +0900] "GET /category/music HTTP/1.1" 200 128 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7"

このように22:00 ~ 23:00のログに絞れます。

コマンドの内容としては、

ログが書かれたaccess_logの出力内容(catで出力)をawkに渡し、ログの4番目の項目(リクエストされた時刻)を$4で取得し、条件に合致するものを表示する

ということをしています。

ちなみに、出力結果をファイルにまとめたい場合は↓でできます。

$ cat access_log | awk '"[21/Jan/2019:22:00:00" <= $4 && $4 <= "[21/Jan/2019:23:00:00"' > result.log