読者です 読者をやめる 読者になる 読者になる

grepやめてawkにする

仕事でやることがなくなってきました。

その結果、本来はJavaJavaScript使ってWebアプリ作ってますが、それ以外の仕事もふられるようになりました。

今回ふられたのはLinux上で動いてるログ監視シェルの修正。

正直得意ではないけど出来ませんと言うと切られるので勿論引き受けました。

フリーランスは辛いです。

やることはログの出力フォーマットが変わったのでそれに合わせて解析方法を修正すること

現在のログのフォーマット
ERROR 2016-12-10 03:21:03,523 ERR001 エラー発生

現在のシェル

let ERROR_COUNT= `grep ^$ERROR /var/log/error.log | wc -l`
  • grepでログファイルの各行の先頭がERRORではじまる行を出力
  • wcで行数を出力
  • 結果をERROR_COUNTに設定

この後に前回解析時のエラー件数をファイルから読み込んでERROR_COUNTの件数と比較、
増えてればエラーが発生したことをメール送信します

変更後のログのフォーマット
2016-12-10 03:21:03,523 ERROR ERR001 エラー発生

エラーの発生日付が先頭に出力されるように変更されました

変更後のシェル

let ERROR_COUNT= `awk '{if($4=="ERROR") print $1}' /var/log/error.log | wc -l`
  • awkでログファイルの各行を区切り文字(デフォルトはスペース)で区切る
  • 区切った文字の4つ目がERRORであれば区切った文字の1つ目を出力
  • wcで行数を出力
  • 結果をERROR_COUNTに設定

ERROR_COUNTに設定するコマンドを変更しただけで後は変更なし

awkは複雑な文字列操作ができますね。

簡単な解析ならgrepでできますが、複雑になるならawkの出番が増えそうです