sed - 仅在模式丢失时打印行

sed - 仅在模式丢失时打印行

我有一个命令输出大量需要解析的行。

输出如下所示:

  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,则打印该行。

相关内容