递归运行 grep cmd 并打印路径名和结果

递归运行 grep cmd 并打印路径名和结果

我有一个日志文件,存在于多个目录中,每个目录对应一个客户端。我正在尝试运行以下命令:

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

相关内容