各クライアントに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