在linux中,我想搜索给定的directoy及其子文件夹/文件以查找某些包含和排除模式。
find /apps -exec grep "performance" -v "warn" {} /dev/null \;
这反映了搜索进入的大量行。我不希望这样,我想找到包含不包含警告的性能的文件。我该怎么做?
答案 0 :(得分:3)
非常接近你已经拥有的东西:
find /apps -exec grep "performance" {} /dev/null \; | grep -v "warn"
通过第二次调用grep
来管道输出。
答案 1 :(得分:3)
要查找包含performance
但不包含warn
的文件,请列出包含performance
的文件,然后过滤掉包含warn
的文件。您需要为每个过滤器单独调用grep
。使用-l
选项grep,以便它只打印文件名而不匹配行。使用xargs
将文件名从第一遍传递到第二遍grep
的命令行。
find /apps -type f -exec grep -l "performance" /dev/null {} + |
sed 's/[[:blank:]\"'\'']/\\&/g' |
xargs grep -lv "warn"
(中间的sed
调用是因为xargs
期望奇怪引用的输入格式与其他任何命令产生的格式不对应。)
答案 2 :(得分:1)
使用-exec
命令的find
选项效果不如将其xargs
移植到find /apps -print0 | xargs -0 grep -n -v "warn" | grep "performance"
:
-name
这可能也解决了打印不需要的输出的问题。您可能还希望使用find /apps -name '*.ext' -print0 | xargs -0 grep -n -v "warn" | grep "performance"
选项来过滤掉特定文件。
{{1}}
答案 3 :(得分:0)
如果你想查找根本不包含“警告”的文件,grep -v
就不是你想要的了 - 打印所有不包含“警告”的行,但它不会告诉你该文件(作为一个整体)不包含“警告”
find /apps -type f -print0 | while read -r -d '' f; do
grep -q performance "$f" && ! grep -q warn "$f" && echo "$f"
done