Grep 模式与多行与操作

Grep pattern with Multiple lines with AND operation

如何使用 grep 确定多行中存在的模式?下面是我需要检查的多行模式是否存在于文件中

 Status:    True
 Type:   Master

我尝试了以下命令,但它在一行中检查了多个字符串,但在多行中无法匹配字符串模式

  if cat file.txt  | grep -P '^(?=.*Status:.*True)(?=.*Type:.*Master)'; then echo "Present"; else echo "NOT FOUND"; fi

file.txt

Interface:                      vlan
Status:                         True
Type:                           Master
ID:                             104

使用 gnu-grep 你可以这样做:

grep -zoP '(?m)^\s*Status:\s+True\s+Type:\s+Master\s*' file

Status:                         True
Type:                           Master

解释:

  • P: 启用 PCRE 正则表达式模式
  • -z: 读取多行输入
  • -o: 只打印匹配的数据
  • (?m) 启用 MULTILINE 模式,以便我们可以在每行
  • 之前使用 ^
  • ^: 开始一行

我是这样做的:

grep -A 1 "^.*Status:.*True" test.txt | grep -B 1 "^Type:.*Master"

-A x 的意思是“还显示 xA 在找到的行之后。
-B y 的意思是“在找到的行之前也显示 yB

因此:将“状态”行与下一行(“类型”行)一起显示,然后将“类型”行与上一行(“状态”行)一起显示。

使用您显示的示例,请尝试执行以下 awk 程序。在 GNU awk.

中编写和测试
awk -v RS='(^|\n)Status:[[:space:]]+True\nType:[[:space:]]+Master' '
RT{
  sub(/^\n/,"",RT)
  print RT
}
'  Input_file

解释: 简单的解释是将 RSawk 的记录分隔符)设置为正则表达式 (^|\n)Status:[[:space:]]+True\nType:[[:space:]]+Master(在下面解释)并在主程序中检查 RT 是否为 NULL,然后在 RT 中删除新行(开始一行)并打印 RT 的值以获得预期OP 显示的输出。

您还可以在末尾的每一行中跟踪上一行设置 prev = [=12=] 并使用模式来匹配上一行和当前行。

awk  '
prev ~ /^[[:space:]]*Status:[[:space:]]*True$/ && [=10=] ~ /^[[:space:]]*Type:[[:space:]]*Master$/{
    printf "%s\n%s", prev, [=10=]
}
{prev = [=10=]}
' file.txt

输出

Status:                         True
Type:                           Master