1

我使用双循环选择所有接口 GigabitEthernet1/0/1 到 1/0/16 和 2/0/1 到 2/0/16 使用高效工具 CISCOCONFPARSE :这是一个例子,它有效:

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)+'$')

问题:有没有办法使用带有正则表达式的简单循环来做同样的事情,例如下面我不正确的示例?

for INT in CONFIG_PARSED.find_objects('^interface GigabitEthernet[1-2]/0/[1-16]$')

下面的另一个示例是一个有效的正则表达式,但不允许选择 1 到 16 个数字:

对于 CONFIG_PARSED.find_objects('^interface GigabitEthernet[1-2]/0/') 中的 INT

谢谢你的帮助

4

1 回答 1

0

你基本上有两个选择......

选项 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)+'$')
于 2014-08-29T11:25:33.183 回答