在文件中搜索模式的目录和子目录

时间:2011-06-03 10:31:04

标签: linux unix sed awk grep

在linux中,我想搜索给定的directoy及其子文件夹/文件以查找某些包含和排除模式。

find /apps -exec grep "performance" -v "warn" {} /dev/null \;

这反映了搜索进入的大量行。我不希望这样,我想找到包含不包含警告的性能的文件。我该怎么做?

4 个答案:

答案 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