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日ごとの集計にしたりもできます。
コメント