如何在cygwin中使用grep查找包含 BOTH 字样的所有文件。
这是我用来递归搜索一个目录中的所有文件:
grep -r "db-connect.php" .
如何扩展上述内容以查找同时包含“db-connect.php”和“version”的文件。
我试过这个:grep -r "db-connect.php\|version" .
但是这是一个OR,即它获取的文件包含一个或另一个。
感谢大家的帮助
答案 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/)' *