我有一个日志文件,存在于多个目录中,每个目录对应一个客户端。我正在尝试运行以下命令:
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 的 wc
答案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