我正在寻找一个命令选项grep
来查找出现foo
和 的文件bar
。
与
grep -r -e foo -e bar .
Run Code Online (Sandbox Code Playgroud)
显示只有foo
或只有的bar
文件和有foo
和的文件bar
。
是否有可能与grep
只找到其中有两个文件foo
和bar
(并显示线相匹配的任一foo
或bar
或两者在这些文件只)?
例子:
echo foo > file1
echo bar > file2
(echo foo;echo;echo bar) >file3
echo barfoo > file4
Run Code Online (Sandbox Code Playgroud)
grep cmd:
grepcmd -r -e foo -e bar .
./file3:foo
./file3:bar
./file4:barfoo
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 10
(假设 GNU grep
/ xargs
)
grep -rl --null abc . | xargs -r0 grep -l bcd
Run Code Online (Sandbox Code Playgroud)
如果你想看到包含线abc
或bcd
或两者同时包含的文件abc
和bcd
:
grep -rl --null abc . |
xargs -r0 grep -l --null bcd |
xargs -r0 grep -He abc -e bcd
Run Code Online (Sandbox Code Playgroud)
grep -re 'foo.*bar' -e 'bar.*foo' .
Run Code Online (Sandbox Code Playgroud)
只要模式不重叠,就可以工作。
grep -re 'abc.*bcd' -e 'bcd.*abc' .
Run Code Online (Sandbox Code Playgroud)
将无法找到包含abcd
.
如果您grep
有-P
PCRE:
grep -rP '^(?=.*abc).*bcd' .
Run Code Online (Sandbox Code Playgroud)
会工作。
或者,POSIXly:
find . ! -type d -exec awk '/abc/ && /bcd/ {print FILENAME ":" $0}' {} +
Run Code Online (Sandbox Code Playgroud)
您还可以使用agrep
:
agrep -r 'abc;bcd' .
Run Code Online (Sandbox Code Playgroud)