grep'ping 多个字符串的文件(不一定在同一行)

Ole*_*nge 5 grep text-processing

更多的时候我喜欢承认我寻找一个包含一些字符串的文件。

目前我这样做:

grep -rl string1 | xargs grep -l string2 | xargs grep -l string3
Run Code Online (Sandbox Code Playgroud)

有没有更漂亮的工具?

greps 为string1orstring2string3

grep -rl -e string1 -e string2 -e string3
Run Code Online (Sandbox Code Playgroud)

我想包含的文件string1string2string3,但不一定在同一行。

也许现代greps ( ag/ack/rg/sift) 之一可以做到这一点?

αғs*_*нιη 7

你可以这样使用grep

grep -rzlP '(?s)(?=.*?string1)(?=.*?string2)(?=.*?string3)' .
Run Code Online (Sandbox Code Playgroud)
  • (?s)已知的“dot-all”告诉grep允许点.也匹配\newline 字符。`

  • (?=.*?pattern): Positive Lookahead,匹配.出现零次或多次*且非贪婪后跟模式( string1, string2, ...) 的任何字符。

您可以创建如下函数(POSIX bash& zsh):

mgrep() { eval grep -rzlP $(printf ''\''(?s)';
          printf '(?=.*?'\''"$%d"'\'')' $(eval echo {1..$#}); printf ''\''') . ; }
Run Code Online (Sandbox Code Playgroud)

然后按如下方式调用,它将在当前工作目录中递归查找包含所有模式的文件。

mgrep string1 string2 string3
Run Code Online (Sandbox Code Playgroud)

它还可以处理grep自身支持的任何类型的模式(根据您的要求提前调整grep功能中的选项)。

mgrep string 'pattern with space' '\d+' [0-9]  [...]
Run Code Online (Sandbox Code Playgroud)