【アクセスログ】特定日時内のログを抽出

ログ解析において、ある特定の時間範囲のログのみを抽出したい場合があります。

その時は「awk」を用いることで抽出することができます。

なんて便利なんだっっっ!

ソースコード

cat access.log | awk '{print $4}' | cut 2-21 | awk '"日時以上" <= $1 && $1 < "日時未満"'

一番きもとなる部分は以下である。

awk '"日時以上" <= $1 && $1 < "日時未満"'
注意
  • 今回はApacheログでの実行なので、使用する際は実際のログに合わせて使用してください
  • awkで時間を抽出時に「[21/Feb/2018:16:29:59」とカッコが付いていると抽出出来ないので、時間のみにしてください
  • 時間以外のログも出力したい場合は下記に例を載せていますので、そちらを使用してください
 
シェルスクリプト内で使用する場合は、AFTERとBEFOREに時間を入れて以下のようにすると範囲を絞れます。

awk ''\"$AFTER\"' <= $1 && $1 < '\"$BEFORE\"''

検証

検証用データには「apache-loggen」というgemのツールを用いました。

「apache-loggen」のインストールと使い方はこちら↓

【アクセスログ】テストデータを作成(apache)

今回生成したテストデータは毎秒1個×10です。

アクセスログのテストデータ
164.90.44.151 - - [21/Feb/2018: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/Feb/2018: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/Feb/2018: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/Feb/2018: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/Feb/2018:21:58:50 +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/Feb/2018:21:58: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/Feb/2018:21: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/Feb/2018:21: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/Feb/2018:21: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/Feb/2018:21: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)"

試しに50秒から5秒間のログを抽出してみました。

実行例
cat access.log | awk '{print $4}' | cut -c 2-21 | awk '"21/Feb/2018:21:58:50" <= $1 && $1 < "21/Feb/2018:21:58:55"'
実行結果
21/Feb/2018:21:58:50
21/Feb/2018:21:58:51
21/Feb/2018:21:58:52
21/Feb/2018:21:58:53
21/Feb/2018:21:58:54

ちゃんと範囲内のログのみが出力されていますね!

時間のみではなく他の情報も出力したい場合は、1つ目のawkで出力する部分を増やす(ex. awk '{print $4 $6}')か、以下のように時間抽出時に含まれてしまう時間以外の文字列を付け加えると出来ます!

ようは名前順に並べて、指定した範囲の文字(ログ)を抽出しているってことです。

他の実行例
cat access.log | awk '"[21/Feb/2018:21:58:50" <= $4 && $4 < "[21/Feb/2018:21:58:55"'
他の例の実行結果
136.216.226.37 - - [21/Feb/2018:21:58:50 +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/Feb/2018:21:58: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/Feb/2018:21: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/Feb/2018:21: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/Feb/2018:21: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)"

アクセスログを時間指定して出力したいことはよくあって、非常に便利なので是非活用してください!

以上、読んでくれてありがとうございました!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です