使用Python CISCOCONFPARSE和正则表达式选择接口列表
我使用了一个双重循环来选择所有接口,从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的数字:
for INT in CONFIG_PARSED.find_objects('^interface GigabitEthernet[1-2]/0/')
感谢任何帮助
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 列表,这些整数代表接口的卡片、插槽和端口号。例如,"GigabitEthernet2/0/11" 的 ordinal_list
是 [2, 0, 11]
。你必须使用 1.1.5 版本(或更高版本),并且在解析时设置 factory=True
才能得到 ordinal_list
。
不要这样做:
你提供的例子在性能上真的很糟糕,因为 find_objects()
会遍历整个 Cisco IOS 配置,从头到尾寻找提供的正则表达式。显而易见的是,使用 find_objects()
遍历整个 Cisco IOS 配置 32 次是非常慢的。
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)+'$')