ログファイルに同一行が何行あるかカウントするワンライナー
アクセスログのファイルなんかを見ていて、「12時台に一番アクセスがあったページはどれかな?」みたいなのを探る時に、コマンドで探る方法を紹介する。
example.log
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
は何かというと、数値での並べ替えを正しい数値順に行うためのモノ。コレを指定しないと、1
→ 10
→ 19
→ 2
→ 20
…という風に並んでしまう。
とりあえずコレで簡単に「重複行の集計」が出来た。