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

答え2

あなたはできます

find . -name 20140926.log | while read file; do 
    printf "%s - " "$file "; grep 123456 $file | grep -c 'food=100' 
done

これは、空白がファイル名を破損しないという利点があります。しかし、改行文字とバックスラッシュでは中断されます。ファイルが全く意味がない場合は、以下を使用してください。

find . -name 20140926.log | while read -rd '' file; do 
    printf "%s - " "$file "; grep 123456 "$file" | grep -c 'food=100'      
done

関連情報