Linux Grep在目录中的所有文件中搜索string1和string2
如何使用cygwin中的grep查找包含两个单词的所有文件 这是我用来递归搜索目录中所有文件的一个单词: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
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/)' *