grep cmd を再帰的に実行し、パス名と結果を出力します。

grep cmd を再帰的に実行し、パス名と結果を出力します。

各クライアントに1つずつ、複数のディレクトリに存在するログファイルがあります。次のコマンドを実行しようとしています。

find . -iname "20140926.log" -exec cat {} \; | grep 123456 | grep 'food="100"' | wc -l

これにより、目的の結果が返されますが、各フルパスの個々の数が何であるかを知りたいです。たとえば、私はこれを試しました:

for f in "/path/*"; do
  result=`eval grep 123456 "$f/logs/20140926.log" | grep 'food="100"' | wc -l`
  echo "$f - $result" 
done

しかし、私のすべてのディレクトリのリストと最終結果のみが返されます。私は次のことを期待しています:

/path1/log/file.log - 0
/path2/log/file.log - 2
/path3/log/file.log - 39
etc...

これにより、各パス/ファイルのgrepのトイレを表示できます。

ベストアンサー1

grep -Hファイル名は印刷されますが、複数のgrepを実行するため、ファイル名を直接エコーできます。

for f in $(find . -name '20140926.log'); do
    echo -n "$f "
    grep 123456 $f | grep -c 'food="100"'   # grep -c prints count of matches
done

おすすめ記事