Linuxコマンドを利用してログを集計する
相変わらず、ログを集計している。
今回は特定の処理を呼ばれたかどうかを集計するだけなので、Pythonスクリプトを作成する必要もない。
日別に何件発生しているのか、集計しようと思う。
最初に結果
1 | find . -name 'app.log.20*' | xargs grep -h "my.Program" | cut -b 1-10 | sort | uniq -c | awk '{print $2"\t"$1}' > res.txt |
これで日別の件数が取得できた。
パイプで繋がれた、それぞれのコマンドにどのような役割があるのか、以下で説明する。
find
1 | find . -name 'app.log.20*' |
ログファイルはapp.log.yyyymmddの形式で出力されている。ログディレクトリに保存されているのだが、当月、当年、それより前でディレクトリ構成が異なる。また、異なるシステムのログファイルも含まれているため、事前にファイルの選別が必要になる。それでfindを利用している。
xargs grep
1 | xargs grep -h "my.Program" |
findの結果をxargsを利用してgrepに通している。
grepでは、見つけたログファイルの中に、特定の文字列(チェック対象のプログラム名)が含まれている行を抽出している。
-hオプションは、grep結果にファイル名が出力されることを抑制するために指定している。
cut
1 | cut -b 1-10 |
grep結果の先頭10バイトは年月日がYYYY/MM/DD形式で書かれている。そこだけを抽出した。
sort
1 | sort |
次の処理で日別の件数を求めるが、そのコマンドは集計キーが並んでいる必要がある。そのためにcutの結果をsortした。
uniq
1 | uniq -c |
uniqコマンドで年月日ごとの出力行数をカウントした。
-cオプションが集計数を表示するオプション。
-cオプションが指定されないと、重複行の除去のみ行われる。
awk
1 | awk '{print $2"\t"$1}' |
uniqの出力結果は”集計件数 集計項目”の順番で出力される。今回の例では下記のように出力される。
1 2 | 100 2018/09/01 98 2018/09/02 |
しかし、これだとExcelに張り付けたときに見栄えが悪いので、”年月日{タブ}件数”の様に出力順を入れ替えた。
>
1 | > res.txt |
これまでの処理結果をres.txtに保存した。
まとめ
ここまでくれば、この結果をテキストエディタで開きコピー、Excelの空のシートに張り付け、貼り付け結果のデータをテーブルに変換し、ピボットグラフを作れば集計は終わりだ。
簡単だし、結構なスピードで集計が完了した。
たまにはコマンドも良い。
- cronで特定の曜日のみ実行
- lsでファイルのみリストする
- Tera TermでCtrl+sを押してしまったとき
- touchコマンドでファイルのアクセス時刻変更
- コマンドラインの最大長を確認する
- 標準出力と標準エラー出力のリダイレクト