下記のようなことをしたいとき、ありますよねー。

  • エラーログから特定のエラーが何回発生したか知りたい
  • アクセスログから特定のページへのアクセス数を知りたい

複数ファイルを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

適宜書き換えてもらえればいろいろ使えるかと。