やりたいこと
$ cat access.log
10.211.55.18
10.211.55.2
10.211.55.21
10.211.55.2
10.211.55.2
10.211.55.21
10.211.55.18
10.211.55.21
10.211.55.21
10.211.55.2
10.211.55.2
10.211.55.21
10.211.55.2
10.211.55.18
上記のようなIPアドレスのリストを記録したログファイルがあったとして、
下記のようにアクセスが多い順に集計したい。
↓処理後の結果
6 10.211.55.2
5 10.211.55.21
3 10.211.55.18
考え方
- ファイルの内容を全てソートして、整理する
- 同一行の出現回数をカウントする
- 出現回数順にソートする
ファイルの内容を全てソートして、整理する
まずは、同じIPアドレスが並ぶようにソートを行う。
sortコマンドを使うことによって、並び替えることができる。
$ cat access.log | sort
10.211.55.18
10.211.55.18
10.211.55.18
10.211.55.2
10.211.55.2
10.211.55.2
10.211.55.2
10.211.55.2
10.211.55.2
10.211.55.21
10.211.55.21
10.211.55.21
10.211.55.21
10.211.55.21
同一行の出現回数をカウントする
uniq
コマンドの、行数をカウントするオプション-c
を利用し、
同一行の出現回数をカウントする
$ cat access.log | sort | uniq -c
3 10.211.55.18
6 10.211.55.2
5 10.211.55.21
最後に、出現回数順にソートを行う
これは、sort
コマンドの-n
オプション(数値ソート)と-r
オプション(逆順ソート)
を利用することで、「数値の多い順」にソートを行う。
$ cat access.log | sort | uniq -c | sort -nr
6 10.211.55.2
5 10.211.55.21
3 10.211.55.18
まとめ
- 「
sort | uniq -c | sort -nr
」はよく利用されるものなので、このまま覚えておくと良い