複数ログファイルをgrepしてマッチした行数を出力するシェルスクリプト
下記のようなことをしたいとき、ありますよねー。
- エラーログから特定のエラーが何回発生したか知りたい
- アクセスログから特定のページへのアクセス数を知りたい
複数ファイルをgrepしてマッチした行数をファイル毎に出力するシェルスクリプトです。
※ログなど圧縮済ファイルを想定してるのでzgrep。
複数ログファイルをgrepしてマッチした行数を出力
# 検索したい文字列
grep_words=()
grep_words[0]="Warning"
grep_words[1]="Notice"
# grep対象のファイル名を宣言
target_files=()
target_files[0]="error_log-20170101.gz"
target_files[1]="error_log-20170102.gz"
target_files[2]="error_log-20170103.gz"
# 検索文字列でループ
for grep_word in ${grep_words[@]}; do
# 出力ファイルを空に(2回実行した場合に追記しないように)
echo -n > tmp/grep_${grep_word}.txt
# grep対象のファイル名でループ
for target_file in ${target_files[@]}; do
# 実行コマンドをコンソールに出力したうえで実行。ログに追記。
echo "zgrep -c \"${grep_word}\" ${target_file}"
hit_count=`zgrep -c "${grep_word}" ${target_file}`
echo "${grep_word} ${target_file} ${hit_count}" >> tmp/grep_${grep_word}.txt
done
done
出力結果はこんな感じ。
tmp/grep_Warning.txt
Warning error_log-20170101.gz 24
Warning error_log-20170102.gz 35
Warning error_log-20170103.gz 103
tmp/grep_Notice.txt
Notice error_log-20170101.gz 235
Notice error_log-20170102.gz 321
Notice error_log-20170103.gz 513
適宜書き換えてもらえればいろいろ使えるかと。