显示匹配的行以及与另一个模式匹配的最近的前一行

显示匹配的行以及与另一个模式匹配的最近的前一行

我有这样的要求,show mac address table其中一个交换机将列出 1000 个条目。

文件1:

switch_1#显示mac地址表
AA:AA:AA:AA:AA:AA 端口 47
BB:BB:BB:BB:BB:BB 端口 48
DD:DD:DD:DD:DD:DD 端口 50
文件2:

switch_2#显示mac地址表
AA:AA:AA:AA:AA:AA 端口 47
BB:BB:BB:BB:BB:BB 端口 48
DD:DD:DD:DD:DD:DD 端口 45

我需要找到一种方法来显示包含的行DD:DD:DD:DD:DD:DD,一旦发生这种情况,它应该搜索上面的几行并打印包含主机名的行

所以输出应该是这样的:

switch_1#显示mac地址表
DD:DD:DD:DD:DD:DD 端口 50
switch_2#显示mac地址表
DD:DD:DD:DD:DD:DD 端口 45

file1file2存储在同一目录中(这些只是示例,大约有 100 多个文件/交换机,并且需要将 MAC 与交换机名称一起过滤)

答案1

awk解决方案

如果我们得到带有散列的行,请将其存储在变量 a 中。

如果我们得到具有匹配 MAC 地址的行,则打印变量 a 以及当前行。

$ awk '/#/{a=$0}/^DD:DD:DD:DD:DD:DD/{print a"\n"$0}' file1 file2
switch_1#show mac address table
DD:DD:DD:DD:DD:DD port 50
switch_2#show mac address table
DD:DD:DD:DD:DD:DD port 45
$

sed解决方案

如果我们得到带有散列的行,请将其放入保留空间 ( h)。

如果我们得到具有匹配 MAC 地址的行,则追加到模式空间 ( H),将保存空间复制到模式空间 ( g),打印模式空间 ( p)

$ sed -n '/#/h;/^DD:DD:DD:DD:DD:DD/{H;g;p}' file1 file2
switch_1#show mac address table
DD:DD:DD:DD:DD:DD port 50
switch_2#show mac address table
DD:DD:DD:DD:DD:DD port 45
$

相关内容