Grep在目录中搜索string1和string2的所有文件

时间:2010-11-25 10:14:19

标签: linux shell grep

如何在cygwin中使用grep查找包含 BOTH 字样的所有文件。

这是我用来递归搜索一个目录中的所有文件:

grep -r "db-connect.php" .

如何扩展上述内容以查找同时包含“db-connect.php”和“version”的文件。

我试过这个:grep -r "db-connect.php\|version" .但是这是一个OR,即它获取的文件包含一个或另一个。

感谢大家的帮助

8 个答案:

答案 0 :(得分:20)

grep -r db-connect.php . | grep version

答案 1 :(得分:4)

如果要在具有不同行的文件中grep几个字符串,请使用以下命令:

grep -rl expr1 | xargs grep -l expr2 | xargs grep -l expr3

这将为您提供包含expr1,expr2和expr3的文件列表。

请注意,如果目录中的任何文件名包含空格,则这些文件将产生错误。这可以通过添加-0来解决,我认为是grep和xargs。

答案 2 :(得分:3)

grep“db-connect.php”* | cut -d:-f1 | xargs grep“version”

我没有在递归模式下尝试它,但它应该是相同的。

答案 3 :(得分:3)

and多个搜索组合在一起,使用多个前瞻断言,除了最后一个之外每个查找一个:

而不是写

grep -P A  * | grep B
你写了

grep -P '(?=.*A)B' *

grep -Pr '(?=.*db-connect\.php)version' .

不要写

grep -P 'A.*B|B.*A' *

因为重叠失败,而(?=…)(?=…)技术没有。

您也可以添加NOT运算符。要搜索与X不匹配的行,通常在命令行上使用-v。但如果它是更大模式的一部分,你就不能这样做。如果是,您可以在模式中添加(?=(?!X).)*$),以排除其中包含X的任何内容。

因此,想象一下你想要将线条与A,B中的所有三个匹配,然后匹配C或D中的任何一个,但是,其中没有X或Y.所有你需要的是:

grep -P '(?=^.*A)(?=^.*B)(?=^(?:(?!X).)*$)(?=^(?:(?!Y).)*$)C|D' *

在某些贝壳和某些场景中。如果它是你的历史替换字符,你将不得不逃脱!

那里,不是很酷吗?

答案 4 :(得分:3)

在我的cygwin中,给定的答案不起作用,但以下是:

grep -l firststring `grep -r -l secondstring . `

答案 5 :(得分:1)

你的意思是“string1”和“string2”在同一行吗?

grep 'string1.*string2'

在同一条线上,但是以不确定的顺序?

grep '(string1.*string2)|(string2.*string1)'

或者两个字符串必须出现在文件中的哪个位置?

grep -e string1 -e string2

答案 6 :(得分:1)

使用具有多行匹配的PCRE(Perl兼容正则表达式)并返回包含两个字符串(AND而不是OR)的文件的文件名。

grep -Plr '(?m)db-connect\.php(.*\n)*version|version(.*\n)*db-connect\.php' .

答案 7 :(得分:0)

为什么只坚持grep:

perl -lne 'print if(/db-connect.php/&/version/)' *