regex - 过滤在下一行不包含模式的行中的第一个单词上匹配的行
问题描述
假设我想过滤掉这个:
==> 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?
解决方案
一个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
推荐阅读
- c++ - 使用不同的 C++ 运行时构建 VS 2017 访问冲突
- ajax - CSRF 使用 AJAX。为什么有可能?
- java - android:java.lang.NoClassDefFoundError:解析失败:Landroid/view/View$OnUnhandledKeyEventListener;
- git - VSCode Git 通过 Remote-SSH
- android - React Native Android App 在收到 FCM 通知时崩溃
- python - 测量黑白图像的平均亮度?
- next.js - Gatsby/NextJS:按域分组页面
- keras - 在 google colab 的 keras 中使用连接时出错
- php - 如何制作返回与需要在其中查找值的数组关联的键名的函数?
- node.js - heroku DATABASE_URL 在 nodejs 应用程序中未定义