如何在 grep 命令中运行多个 AND

Tom*_*Tom 1 linux grep bash

我试图在 grep 命令中运行多个 AND 组合,我能够使用两种模式运行:

grep -E 'pattern1.*pattern2' filename

是否可以使用上述方法使用三个或四个图案?

Jan*_*nis 7

如果模式的顺序是固定的,那么您可以轻松使用,grep如下所示:

grep -E 'pattern1.*pattern2.*pattern3'
Run Code Online (Sandbox Code Playgroud)

但是,如果所有模式都必须存在并且它们可以以任何顺序出现,那么您就会得到组合复杂性;例如对于两种模式:

grep -E '(pattern1.*pattern2|pattern2.*pattern1)'
Run Code Online (Sandbox Code Playgroud)

(对于三种模式,您已经有八种组合)。

在这种情况下(即使用 时grep),最好在grep每个模式一个实例的管道中级联调用:

grep pattern1 <infile | grep pattern2 | grep pattern3
Run Code Online (Sandbox Code Playgroud)

每个实例将仅过滤与其模式匹配的行,并且总体结果将仅包含具有所有模式的行。

获得最清晰解决方案的更好方法是使用awk

awk '/pattern1/ && /pattern2/ && /pattern3/'
Run Code Online (Sandbox Code Playgroud)

在这样的表达式中,顺序并不重要。