如何 grep 同时包含几个单词的文件名

如何 grep 同时包含几个单词的文件名

我做了以下事情:

for i in ~/files/*; do cat $i | grep -e word1 -e word2; done

输出结果为:所有包含 word1 的值以及所有包含 word2 的文件。不仅仅是包含这两个文件。我还想要文件的名称,而不仅仅是值。

答案1

一般来说,您可以使用grep-H选项“打印每个匹配的文件名”。

这将找到包含以下内容的行word1 或者 word2

grep -HE "word1|word2" ~/files/* 2>/dev/null

如果你想找到word1 word2,而是这样做:

grep -HE "word1.*word2|word2.*word1" ~/files/* 2>/dev/null

将 stderr 发送到黑暗的遗忘之地可以2>/dev/null防止grep输出无用的错误消息,例如,如果其中一个匹配的文件是目录。

答案2

grep通常打印匹配的行任何提供的模式。要打印与多个模式匹配的行,请将一个 grep 的输出通过管道传输到另一个 grep:

grep word1 | grep word2

对于许多文件:

grep word1 ~/files/* | grep word2

无需循环或cat

对于名称包含 的文件,此方法可能无法正常工作word2。在这种情况下,请手动将模式组合成单个 grep:

grep -e 'word1.*word2' -e 'word2.*word1' ~/files/*

当向 提供多个文件时grep,它默认打印文件名。要强制对单个文件名执行此操作,请使用-H

-H, --with-filename
      Print the file name for each match.  This is  the  default  when
      there is more than one file to search.

如果您收到有关参数列表太长的错误,并且目录不包含子目录,我仍然会告诉grep您递归:

grep -R -e 'word1.*word2' -e 'word2.*word1' ~/files

相关内容