【Linux】シェルでログの集計を行うコマンド

Linuxコマンド シェル

やりたいこと

$ 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

考え方

  1. ファイルの内容を全てソートして、整理する
  2. 同一行の出現回数をカウントする
  3. 出現回数順にソートする

ファイルの内容を全てソートして、整理する

まずは、同じ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」はよく利用されるものなので、このまま覚えておくと良い
タイトルとURLをコピーしました