我想在包含两个单词的目录树中找到所有文本文件,word1
并且word2
(例如)。我不能只grep
for 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
在GNU
和FreeBSD
userland 上进行了测试。