你基本上有两个选择......
选项 A:使用稳定且受支持的 CiscoConfParse 代码自行解析端口号...
import re
from ciscoconfparse import CiscoConfParse
CONFIG_PARSED = CiscoConfParse(CONFIG)
intf_rgx = re.compile(r'interface GigabitEthernet(\d+)\/(\d+)\/(\d+)$')
for obj in CONFIG_PARSED.find_objects('^interface GigabitEthernet'):
mm = intf_rgx.search(obj.text))
card = int(mm.group(1))
port = int(mm.group(3))
if card>2:
continue
if port>16:
continue
## Do something here with obj
选项 B:将端口号解析卸载到 CiscoConfParse 的 alpha 质量(从 1.1.5 版开始)端口号解析器...
import re
from ciscoconfparse import CiscoConfParse
CONFIG_PARSED = CiscoConfParse(CONFIG, factory=True)
for obj in CONFIG_PARSED.find_objects('^interface GigabitEthernet'):
card = obj.ordinal_list[0]
port = obj.ordinal_list[-1]
if card>2:
continue
if port>16:
continue
## Do something here with obj
仅供参考,obj.ordinal_list
返回代表接口卡、插槽和端口号的整数 python 列表。例如ordinal_list
“GigabitEthernet2/0/11”是[2, 0, 11]
. 您必须使用版本 1.1.5(或更高版本)并解析 withfactory=True
以获取ordinal_list
.
不要这样做:
从性能的角度来看,您提供的示例确实很糟糕,因为find_objects()
遍历整个 Cisco IOS 配置,开始寻找提供的正则表达式。如果不明显,遍历整个 Cisco IOS 配置 32 次不同的时间find_objects()
非常慢。
CONFIG_PARSED = CiscoConfParse(CONFIG)
for i in range(1,3):
for j in range(1,17):
INT = CONFIG_PARSED.find_objects('^interface GigabitEthernet'+str(i)+'/0/'+str(j)+'$')