ログファイルに同一行が何行あるかカウントするワンライナー

アクセスログのファイルなんかを見ていて、「12時台に一番アクセスがあったページはどれかな?」みたいなのを探る時に、コマンドで探る方法を紹介する。

2020-01-01T00:01:24 /index.html    200
2020-01-01T00:01:25 /somepage.html 200
2020-01-01T00:01:31 /index.html    200
2020-01-01T00:01:35 /mail.html     200
2020-01-01T00:01:36 /index.html    200
2020-01-01T00:01:37 /mail.html     200
2020-01-01T00:01:38 /index.html    200
2020-01-01T00:01:40 /index.html    200

……こういう感じの形式のログ

このログだと、2列目に「アクセスがあったページのパス」が出力されている。そこで、次のようなコマンドで、2列目のパス部分だけを抽出する。

$ cat example.log | cut -d ' ' -f2

/index.html
/somepage.html
/index.html
/mail.html
/index.html
/mail.html
/index.html
/index.html

コレをベースに使うのは、次のコマンド。

sort | uniq -c | sort -n

この sort | uniq -c | sort -n というイディオムで、「重複する行の数をカウント」できる。実際にやってみよう。

$ cat example.log | cut -d ' ' -f2 | sort | uniq -c | sort -n

   1 /somepage.html
   2 /mail.html
   5 /index.html

このとおり。これでいくと、/index.html というパスへのアクセス数が一番多い、ということが簡単に分かる。

uniq -c で重複する行数を出力してくれる。「何で事前に sort するの?」というと、uniq コマンドは予め sort したデータでないと正常に処理してくれないためだ。

sort -n-n は何かというと、数値での並べ替えを正しい数値順に行うためのモノ。コレを指定しないと、11019220 …という風に並んでしまう。


とりあえずコレで簡単に「重複行の集計」が出来た。