我经常使用grep两次发现,以搜索两种模式中的一个文件,如下所示:
find . -name \*.xml | xargs grep -l "<beans" | xargs grep singleton
然后,我遇到了文件与空间,当然这打破了上面的命令。 我修改了它如下处理的空间:
find . -name \*.xml -print0 | xargs -0 grep -l "<beans" | xargs grep singleton
-print0告诉找到使用打印空作为分隔符,而不是空间和-0选项告诉xargs的期望空。 这只要作品因为没有我期待的有他们的道路空间的文件,但它打破了如果他们这样做。
所以,我需要的是一个标志,告诉grep的作为speartor,而不是换行打印空。
有任何想法吗?
好问题。 你可以grep的-l用空值作为与Z选项的分隔符:
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
第一个解决方案是更好不过。
find . -name "*.xml" -exec grep -q "<beans" {} \; -exec grep -q "singleton" {} \; -print
如果您计划在以后的管顺序使用这些文件的名字,像你上面做变化-print
到-print0
如果您使用GNU并行,而不是xargs的,那么你就可以避免在默认情况下分裂的换行,而不是白色的空间处理这一点,因为GNU并行。
find . -name \*.xml | parallel grep -l "<beans" | parallel grep singleton
观看介绍视频,以了解更多: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
为了避免空间问题,我会使用新的行字符作为分隔符为-d选项xargs的:
xargs -d '\n' ...
对于两个独立的模式搜索我会使用egrep的:
egrep '(pattern one|pattern two)' ...
所以我的完整的解决方案将是:
find . -name \*.xml | xargs -d '\n' egrep '(pattern one|pattern two)'