ワンライナーでログの集計(時間ごとの件数)

linux command

Linuxのコマンドを組み合わせて、ログの集計をします。

ログの集計

 例えば、以下のようなWebサーバ(Apache)のログを1時間ごとに集計してみます。

xxx.xxx.xxx.xxx - - [01/Dec/2023:15:51:46 +0900] "GET / HTTP/1.1" 200 2731 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.123 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

 ここで、ログの最初のほうを眺めて、スペース区切りにしたとき、先頭から4つ目に時刻のふぃーるどがあります。(「+0900]」は、スペースで区切られた後の5つ目のフィールドなので除外します。)

[01/Dec/2023:15:51:46

 ここまでをワンライナーで書いてみます。

# cat /var/log/html/access.log | awk '{print $4;}' | head
[01/Dec/2023:00:00:01
[01/Dec/2023:00:00:05
[01/Dec/2023:00:00:06
[01/Dec/2023:00:00:18
[01/Dec/2023:00:00:20
[01/Dec/2023:00:00:21
[01/Dec/2023:00:00:21
[01/Dec/2023:00:00:23
[01/Dec/2023:00:00:25
[01/Dec/2023:00:00:26
#

 うまく出力できました。実際には自分の環境に合わせて、ログの場所や、日時が書かれたフィールドの順番を調整します。

 さらに、1時間ごとに集計をしたいので、以下の部分を抽出します。

01/Dec/2023:00

 ワンライナーで書いてみます。

# cat /var/log/html/access.log | awk '{print $4;}' | cut -b 2-15 | head
01/Dec/2023:00
01/Dec/2023:00
01/Dec/2023:00
01/Dec/2023:00
01/Dec/2023:00
01/Dec/2023:00
01/Dec/2023:00
01/Dec/2023:00
01/Dec/2023:00
01/Dec/2023:00
#

 これもうまくいきました。2~15文字目を抽出しました。

 いよいよ集計をします。

# cat /var/log/html/access.log | awk '{print $4;}' | cut -b 2-15 | uniq -c
 282 01/Dec/2023:00
  67 01/Dec/2023:01
  72 01/Dec/2023:02
  48 01/Dec/2023:03
 110 01/Dec/2023:04
  31 01/Dec/2023:05
 128 01/Dec/2023:06
  78 01/Dec/2023:07
 205 01/Dec/2023:08
 282 01/Dec/2023:09
 311 01/Dec/2023:10
 159 01/Dec/2023:11
1440 01/Dec/2023:12
 482 01/Dec/2023:13
 282 01/Dec/2023:14
 664 01/Dec/2023:15
 367 01/Dec/2023:16
 592 01/Dec/2023:17
8638 01/Dec/2023:18
 390 01/Dec/2023:19
 793 01/Dec/2023:20
 432 01/Dec/2023:21
 231 01/Dec/2023:22
 657 01/Dec/2023:23
#

 1時間ごとのログ件数が集計できました。uniqコマンドを使って、同じ日時の行の件数を表示させました。実際には、最初のログの表示のところを変えてやると、複数のログをまとめて処理をすることもできます。cutコマンドのところを調整することで、1日ごとの集計にしたりもできます。

コメント