![正则表达式 awk 到 Cisco 接口](https://linux22.com/image/30935/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%20awk%20%E5%88%B0%20Cisco%20%E6%8E%A5%E5%8F%A3.png)
我想知道是否有一些 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 无法访问