我有一个命令输出大量需要解析的行。
输出如下所示:
PORT-A 3 HOSTNAME PRODUCT1 14 29
PORT-B 7 HOSTNAME PRODUCT2 22 18 41
PORT-C 9 HOSTNAME PRODUCT2 22 18 41
PORT-D 4 HOSTNAME PRODUCT1 14
PORT-B 2 HOSTNAME PRODUCT1
我一直sed -nr '/PRODUCT1|14|29/p'
只打印与每个模式匹配的行。
输出使用sed -nr '/PRODUCT1|14|29/p'
:
PORT-A 3 HOSTNAME PRODUCT1 14 29
PORT-D 4 HOSTNAME PRODUCT1 14
PORT-B 2 HOSTNAME PRODUCT1
我只想sed
在这 3 个模式之一丢失时才打印这些行。关于如何实现这一目标有什么想法吗?
理想输出:
PORT-D 4 HOSTNAME PRODUCT1 14
PORT-B 2 HOSTNAME PRODUCT1
答案1
您不太可能轻松地做到这一点sed
。如果我正确理解您的需求,如果三个模式中恰好有一个不匹配,并且恰好有两个模式不匹配,则您想要打印该行做匹配。在 sed 中,这需要三个执行路径。在每种情况下,您都需要测试两个模式中的每一个是否成功匹配,并测试第三个模式是否成功匹配。
为了完整起见,以下sed
脚本可以满足您所述的需求:
sed -nr '/PRODUCT1/{/14/{/29/!p}};/14/{/29/{/PRODUCT1/!p}};/PRODUCT1/{/29/{/14/!p}}'
请注意,这执行正则表达式匹配的复杂度为 O(n^2)。如果您添加更多模式来测试更多字段,这会变得......笨拙。
awk
在或中执行类似的操作可能会更好perl
,您可以在其中实现计数器变量。在此类语言中,测试每个模式,如果匹配则增加一个计数器,并为每个测试的模式增加另一个计数器。如果匹配计数器比模式计数器少 1,则打印该行。