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
的意思是“还显示 x
行 A 在找到的行之后。
-B y
的意思是“在找到的行之前也显示 y
行 B。
因此:将“状态”行与下一行(“类型”行)一起显示,然后将“类型”行与上一行(“状态”行)一起显示。
使用您显示的示例,请尝试执行以下 awk
程序。在 GNU awk
.
中编写和测试
awk -v RS='(^|\n)Status:[[:space:]]+True\nType:[[:space:]]+Master' '
RT{
sub(/^\n/,"",RT)
print RT
}
' Input_file
解释: 简单的解释是将 RS
(awk
的记录分隔符)设置为正则表达式 (^|\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
如何使用 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
的意思是“还显示 x
行 A 在找到的行之后。
-B y
的意思是“在找到的行之前也显示 y
行 B。
因此:将“状态”行与下一行(“类型”行)一起显示,然后将“类型”行与上一行(“状态”行)一起显示。
使用您显示的示例,请尝试执行以下 awk
程序。在 GNU awk
.
awk -v RS='(^|\n)Status:[[:space:]]+True\nType:[[:space:]]+Master' '
RT{
sub(/^\n/,"",RT)
print RT
}
' Input_file
解释: 简单的解释是将 RS
(awk
的记录分隔符)设置为正则表达式 (^|\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