3

我经常将 grep 与 find 一起使用两次,以便在文件中搜索两个模式,如下所示:

find . -name \*.xml | xargs grep -l "<beans" | xargs grep singleton

然后我遇到了带有空格的文件,这当然破坏了上述命令。我对其进行了如下修改以处理空格:

find . -name \*.xml -print0 | xargs -0 grep -l "<beans" | xargs grep singleton

选项 -print0 告诉 find 使用 print null 作为分隔符而不是空格, -0 告诉 xargs 期待 null。只要我要查找的所有文件的路径中都没有空格,它就可以工作,但如果有,它就会中断。

所以我需要一个标志来告诉 grep 打印 null 作为 speartor 而不是换行符。

有任何想法吗?

4

4 回答 4

4

好问题。您可以使用 Z 选项使 grep -l 使用空值作为分隔符:

find . -name \*.xml -print0 | xargs -0 grep -lZ "<beans" | xargs grep singleton

您还可以将 xargs 设为换行符作为分隔符。这也应该适用:

find . -name \*.xml -print0 | xargs -0 grep -l "<beans" | xargs "--delimiter=\n" grep singleton

不过,第一个解决方案更好。

于 2012-09-28T19:39:25.373 回答
1
find . -name "*.xml"  -exec grep -q "<beans" {} \; -exec grep -q "singleton" {} \; -print

如果您打算像上面所做的那样在以后的管道序列中使用这些文件名,请更改-print-print0

于 2012-09-29T09:45:06.153 回答
1

如果您使用 GNU Parallel 而不是 xargs 那么您可以避免处理这个问题,因为默认情况下 GNU Parallel 在换行符而不是空格上拆分。

find . -name \*.xml | parallel grep -l "<beans" | parallel grep singleton

观看介绍视频以了解更多信息:https ://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

于 2012-10-05T14:37:47.397 回答
0

为了避免空格问题,我将使用换行符作为带有 -d 选项的 xargs 的分隔符:

xargs -d '\n' ...

对于两个单独的模式搜索,我会使用 egrep:

egrep '(pattern one|pattern two)' ...

所以我的完整解决方案是:

find . -name \*.xml | xargs -d '\n' egrep '(pattern one|pattern two)'
于 2016-08-03T11:06:31.673 回答