首页 > 解决方案 > 过滤在下一行不包含模式的行中的第一个单词上匹配的行

问题描述

假设我想过滤掉这个:

==> DEVICE 1 <==
interface GigabitEthernet3/0/28
 switchport access vlan 123
interface GigabitEthernet3/0/29
interface GigabitEthernet3/0/30
interface GigabitEthernet3/0/32
 switchport access vlan 15
interface GigabitEthernet3/0/33
==> DEVICE 2 <==
interface GigabitEthernet3/0/28
 switchport access vlan 123
interface GigabitEthernet3/0/29
interface GigabitEthernet3/0/30
interface GigabitEthernet3/0/32
 switchport access vlan 15
interface GigabitEthernet3/0/33

对此:

==> DEVICE 1 <==
interface GigabitEthernet3/0/28
 switchport access vlan 123
interface GigabitEthernet3/0/32
 switchport access vlan 15
==> DEVICE 2 <==
interface GigabitEthernet3/0/28
 switchport access vlan 123
interface GigabitEthernet3/0/32
 switchport access vlan 15

我可以选择:

grep switchport -B1 file但这不会输出设备名称,使用 -B2 有时会输出设备名称,具体取决于顺序...

另一个逻辑是过滤掉与“interface”行中第一个单词匹配的所有行,其中下一行后面没有“switchport”。

实现这一目标的最佳方法是什么?Grep、Awk、sed?

标签: regexbashawksed

解决方案


一个awk更好的选择:

awk '$1 == "==>"{print} $1=="switchport"{print p; print} {p=$0}' file
==> DEVICE 1 <==
interface GigabitEthernet3/0/28
 switchport access vlan 123
interface GigabitEthernet3/0/32
 switchport access vlan 15
==> DEVICE 2 <==
interface GigabitEthernet3/0/28
 switchport access vlan 123
interface GigabitEthernet3/0/32
 switchport access vlan 15

推荐阅读