find + cat + grepでファイルを検索するスクリプト

例えば、ログファイルの中に特定のエラーメッセージがないか検索したいとします。

ディレクトリの全ファイルを対象にする場合find + cat + grepを組み合わせて使うのですが、マッチした行だけ表示されてファイル名が出ないのが惜しいです。

そこで、マッチした場合はファイル名を先に表示するような簡易スクリプトを作ってみました。

#!/bin/sh

# 引数チェック
if [ $# -ne 3 ]; then
	echo "Error"
	exit 1
fi

# 検索ディレクトリ
DIR=$1

# 検索ファイル
FILE=$2

# 検索語句
WORD=$3

for file in `find $DIR -name $FILE | sort`
do
	# マッチした場合のみ表示
	if result=`cat -n $file | grep "$WORD"`
	then
		echo $file
		echo
		echo -e "$result"
		echo
	fi
done

これをsearchという名前にして、/usr/local/binに置きます。

「/var/log/imarket/tdnet」ディレクトリの「*.log」ファイルから「"Download PDF File Error"」という語句を検索する場合、以下のように書きます。

search /var/log/imarket/tdnet *.log "Download PDF File Error"

出力はこんな感じです。
ファイル名に続いて行数と該当行が表示されます。

/var/log/imarket/tdnet/application-2012-09-20.log

  4443  java.lang.RuntimeException: Download PDF File Error : 140120120920007971.pdf

/var/log/imarket/tdnet/application-2012-10-05.log

  3745  java.lang.RuntimeException: Download PDF File Error : 140120121005014395.pdf
  4472  java.lang.RuntimeException: Download PDF File Error : 140120121005014510.pdf

...以下省略