查找所有包含关键字的文件

查找所有包含关键字的文件

我想在包含两个单词的目录树中找到所有文本文件,word1并且word2(例如)。我不能只grepfor word1 word2,因为这只会找到两个单词连续出现的情况。我想找到包含以下内容的所有文件两个都这两个词,但不一定是连续的。

理想情况下,搜索应打印文件名以及在文件中找到术语的上下文。这会很有帮助。 GUI 不会有什么坏处。

我该怎么做?

答案1

我将使用find的功能,其中每个测试都必须通过才能将文件视为匹配。将两个grep命令链接在一起以匹配条件:

find . -type f -exec grep -q word_one {} \; -exec grep -l word_two {} \;

您可以根据需要调整 grep 的标志,包括在单词具有任何 shell 特殊字符或正则表达式特殊字符时引用单词(或使用grep -F)。

答案2

如何搜索存在两个不同单词的文件? 对于您的基本问题有很多好的解决方案。为了满足您显示上下文的额外要求,我们只需采用这些答案之一(例如,史蒂芬的)并添加一点:

find . -type f -exec grep -q word1 {} ';' -exec grep -q word2 {} ';'  \
                                            -exec grep -A3 -B3 -E -H 'word1|word2' {} +

find . -type f -exec grep -q word1 {} ';' -exec grep -q word2 {} ';'部分只是 Stéphane 的第二个答案(可移植但简单的答案),其中-l第二个选项grep(列出文件名)替换为-q(搜索并以状态悄悄退出)。然后我们添加一个决赛grep来显示结果。  每场比赛后-A3显示-B3三行,前显示三行;根据您的口味调整这些。-E要让扩展正则表达式word1|word2 在没有\;的情况下工作是必要的。即使只有一个文件,也会-H强制打印文件名。grep

答案3

你会这样做grep

grep -Elrz "word2(.|\n)*word1|word1(.|\n)*word2" .

如果您需要在输出中匹配内容,请删除l上述选项。

答案4

我的第一个想法是首先搜索包含的文件word1,然后在其中搜索包含word2.这将是:

grep -l word1 -r . | xargs grep -l word2

例子:

$ cat FILE
word1
$ cat FILE1
word2
$ cat FILE2
word1
word2
$ grep -l word1 -r . | xargs grep -l word2
FILE2

GNUFreeBSDuserland 上进行了测试。

相关内容