Apacheのログをまとめてgrepしてwc -lするbashシェルスクリプト


QSH(急に仕事で必要になったので)

概要

Apacheのログだけではないけれど、ファイルの中身を検索(grep)して、該当する行数をカウント(wc -l)して表示する。

ファイル名にワイルドカードが使えるので、複数ファイルをまとめてgrepできる。

gzip圧縮(.gz)がかかっているファイルも検索(zgrep)できる。

ついでにファイルごとに出力するので、ファイル単位で結果が得られる。

ちなみにLinux用。

スクリプト

#!/bin/bash

# greplogall - grep all log file
# SUNAGAWA Hiroyuki / Studio JamPack
# 2016.03.22
# target stringをログファイルの中から探して、行数をカウントするスクリプト
# 
# USAGE ./greplogall.sh "target string" /var/log/ログファイル名
# ログファイル名はワイルドカード(*)が有効。
# しかしあまり大量のファイルを処理させると
# サーバの負荷が高くなるのでお止めになったほうが良い。
# 
# 例: ./greplogall.sh "/hoge/ " /var/log/httpd/access_log.201511*
#     2015/11月のログ全部から /hoge/ を探して件数を返す。

targetstr=$1
shift

echo . 
echo greplogall - grep all log file
echo SUNAGAWA Hiroyuki / Studio JamPack
echo 2016.03.22
echo .

while [ "$1" != "" ]
do
  echo -n $targetstr
  echo -n ","
  echo -n $1
  echo -n ","
  if [[ $1 =~ .gz$ ]]; then
    /usr/bin/zgrep $targetstr $1 | wc -l;
  else
    /bin/grep $targetstr $1 | wc -l;
  fi
  shift
done

exit 0

結果

/hoge/,/var/log/httpd/access_log.20160227.gz,40417
/hoge/,/var/log/httpd/access_log.20160228.gz,34528
/hoge/,/var/log/httpd/access_log.20160229.gz,21177

コツ

http://jamfunk.jp/hoge/のアクセスを検索したい場合は”/hoge/ “(スラッシュの後ろにスペース)で検索すると、”/hoge/example.html”などを回避できる。ただ、リファラにも引っかかるかもしれない。

なお

使用は自己責任