正则表达式 awk 到 Cisco 接口

正则表达式 awk 到 Cisco 接口

我想知道是否有一些 Sed/Grep 或 Awk 正则表达式来解析 Cisco 接口部分,具有特定属性,如下所示。

文件.txt的内容

!
interface FastEthernet0/1
 no ip unreachables
!
interface FastEthernet0/2
 no ip proxy-arp
!

脚本:

#!/bin/bash
VALUE="no ip proxy-arp"
awk -v RS='!\n' -v PATTERN=${VALUE} '/$PATTERN/' file.txt | awk '/^interface/';
exit 0

问题是当我直接从 shell 运行 line 时,它​​可以工作,但是当我从脚本运行时,它不起作用。

运行bash -x,我可以看到awk不能替换变量值。

有什么建议 ?

答案1

很难相信这在你的 shell 中有效。尽管如此,这段代码包含几个错误,而且恕我直言,它的方法也是错误的。

awk 需要一个字符串,//而不是变量。这些是常量正则表达式。因此,您要么让 shell 将变量放在那里,要么使用~.

您的修正方法:

awk -v RS='!\n' -v PATTERN="${VALUE}" '$0 ~ PATTERN' file.txt | 
  awk '/^interface/'

我很惊讶这有效。从文档中我预计,由于 RS 的设置,会出现不需要的“!”将被打印。不过,我认为这个更好:

awk -v PATTERN="${VALUE}" \
  '$0 ~ PATTERN { print previousline; }; { previousline=$0; }' file.txt

或使用硬编码模式

awk '/no ip proxy-arp/ { print previousline; }; { previousline=$0; }' file.txt

或者用 shell 写模式

awk /"$VALUE"/' { print previousline; }; { previousline=$0; }' file.txt

答案2

回声”!
接口 FastEthernet0/1
 没有 ip 无法访问
接口 FastEthernet0/2
 没有 ip 代理 arp
" | pcregrep -M "^接口.*0/1\n (.*\n)!"

结果:

接口 FastEthernet0/1
 没有 ip 无法访问

相关内容