Grep在目录中searchstring1和string2的所有文件

我怎样才能利用cygwin中的grep来find所有包含这两个词的文件。

这是我用来recursionsearch目录中的所有文件的一个单词:

grep -r "db-connect.php" . 

我怎样才能扩展以上查找包含“db-connect.php”和“版本”的文件。

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

感谢所有的帮助

Solutions Collecting From Web of "Grep在目录中searchstring1和string2的所有文件"

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

如果你想在一个文件中有多个字符串的grep,使用下面的命令:

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

这会给你一个包含expr1,expr2和expr3的文件列表。

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

grep“db-connect.php”* | 切-d:-f1 | xargs grep“版本”

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

为了一起搜索多个搜索,使用多个前瞻断言,除了最后一个之外,每个搜索都有一个搜索:

而不是写作

 grep -PA * | 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' * 

在一些贝壳和一些设置。 你必须逃避! 如果这是你的历史替代人物。

在那里,这不是很酷吗?

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

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

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

 grep 'string1.*string2' 

在同一行,但不确定的顺序?

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

或者两个字符串都必须出现在文件中

 grep -e string1 -e string2 

使用带有多行匹配的PCRE(Perl-Compatible Regular Expressions),并返回包含两个字符串( AND而不是OR )的文件的文件名。

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

为什么只坚持grep:

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