Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Grep在目录中的所有文件中搜索string1和string2_Linux_Shell_Grep - Fatal编程技术网

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

Linux Grep在目录中的所有文件中搜索string1和string2,linux,shell,grep,Linux,Shell,Grep,如何使用cygwin中的grep查找包含两个单词的所有文件 这是我用来递归搜索目录中所有文件的一个单词: grep -r "db-connect.php" . 如何扩展上述内容以查找同时包含“db connect.php”和“version”的文件 我试过:grep-r“db connect.php\| version”。但这是一个OR,即它获取包含其中一个的文件 谢谢大家的帮助grep“db connect.php”*| cut-d:-f1 | xargs grep“version” gre

如何使用cygwin中的grep查找包含两个单词的所有文件

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

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

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

谢谢大家的帮助

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

grep -r db-connect.php . | grep version
我没有在递归模式下尝试它,但它应该是相同的。

您是指同一行上的“string1”和“string2”吗

grep 'string1.*string2'
在同一行但顺序不确定

grep '(string1.*string2)|(string2.*string1)'
或者两个字符串都必须出现在文件中的任何位置

grep -e string1 -e string2
使用带有多行匹配的PCRE(Perl兼容正则表达式),并返回包含两个字符串(
而不是
)的文件的文件名


若要将多个搜索组合在一起,请使用多个先行断言,除了上一个之外,每个查找的内容都有一个断言:

而不是写作

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' *
在某些shell和某些设置中。你必须避开
如果它是您的历史替换字符


好了,这不是很酷吗?

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

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

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

grep -rl expr1 | xargs grep -l expr2 | xargs grep -l expr3
这将为您提供包含expr1、expr2和expr3的文件列表


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

为什么只使用grep:

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

你可以做两个greps。一对一,一对另一,然后找到匹配文件的交集。这并不是那么琐碎,但我不知道是否有更好的方法。可能是辉煌的复制品,谢谢。返回的文件似乎比我预期的少。正在调查…这是否遗漏了两个字符串都在文件中但在不同行上的情况?是的,它将@lathomas64。这不会返回两个字符串都在其中的文件,而是返回其中一个字符串。对吗?不,它应该返回包含这两个字符串的所有文件(这些字符串在不同的行上)。Try:grep“db connect.php”*| cut-d:-f1 | xargs grep“version”| cut-f1-d:只包含文件名…最后一个命令很有用,有助于确认我需要检查的文件。谢谢你+1.有一个类似的案例,除了第一个grep只返回1个文件外,这一切都很顺利,然后没有从xargs grep中获取文件名,只是第二个字符串,最后一个字符串与
grep'string1\| string2'
相同,并且是
而不是
。为了使用空分隔符处理带有空白字符的文件名:
grep-rl-Z expr1 | xargs-0 grep-l-Z expr2 | xargs-0 grep-Z-lexpr3
perl -lne 'print if(/db-connect.php/&/version/)' *