やりたいこと
$ 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」はよく利用されるものなので、このまま覚えておくと良い