首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python解析cisco配置文件以查找具有特定服务策略的接口

使用python解析cisco配置文件以查找具有特定服务策略的接口
EN

Stack Overflow用户
提问于 2013-10-01 02:50:50
回答 3查看 10.6K关注 0票数 2

我有数百个cisco配置文件,我需要(通过python)查找(通过python)具有特定服务策略的接口,在本例中为WIRELESS-IN。我用来捕获接口的正则表达式是: pat=re.compile('( interface .*?)!$',re.DOTALL|re.M)

在这种情况下,我需要返回FastEthernet1/0/2

示例数据可能如下所示:

我有一个正则表达式来将Interface元素匹配到一个组中,但不知道如何在该组中查找。有人能帮上忙吗?

代码语言:javascript
复制
interface FastEthernet1/0/1
 description Foo
 switchport access vlan 300
 switchport mode access
 switchport port-security aging time 2
 no logging event link-status
 speed 100
 duplex full
 priority-queue out
 mls qos trust dscp
 no snmp trap link-status
 no cdp enable
 spanning-tree portfast
 hold-queue 120 in
 hold-queue 200 out
 ip dhcp snooping trust
!
interface FastEthernet1/0/2
 description wlap2
 switchport access vlan 100
 switchport mode access
 switchport port-security maximum 15
 switchport port-security
 switchport port-security aging time 2
 switchport port-security aging type inactivity
 ip access-group 100 in
 no logging event link-status
 srr-queue bandwidth shape 0 0 0 10
 queue-set 2
 priority-queue out
 no snmp trap link-status
 storm-control broadcast level pps 100 50
 storm-control multicast level pps 100 50
 storm-control action trap
 spanning-tree portfast
 spanning-tree bpduguard enable
 service-policy input WIRELESS_IN
 ip dhcp snooping limit rate 15
!
interface FastEthernet1/0/3
 description Test3
 switchport access vlan 199
 switchport mode access
 switchport port-security aging time 2
 no logging event link-status
 queue-set 2
 priority-queue out
 mls qos trust dscp
 no snmp trap link-status
 no cdp enable
 spanning-tree portfast
 service-policy input VOICE-LAN

我拼凑了这段代码:

代码语言:javascript
复制
import re,string
f = open("sampleconfig.cfg")
cfgdata = f.read()
pat=re.compile('(interface.*?)!$',re.DOTALL|re.M)
pat2 = re.compile("service-policy.input.WIRELESS-IN")

data = pat.findall(cfgdata)
i=0
while i < len(data):
    if  pat2.findall(data[i]):
        print (data[i].split("\n")[0])
        i = i+1

    else:
        i = i+1
        pass
EN

回答 3

Stack Overflow用户

发布于 2014-09-16 20:42:40

这是否是一种更好的方式还存在争议,但至少有一些不同:

代码语言:javascript
复制
import re,string
f = open("sampleconfig.cfg")
cfgdata = f.read()
pat = '(?sm)interface (\S*)(?:(?!^!$).)*service-policy.input.WIRELESS_IN.*?!$'
data = re.findall(pat, cfgdata)
票数 1
EN

Stack Overflow用户

发布于 2019-11-23 18:40:20

解决此任务的另一种方法是使用TTP模块(我是该模块的作者)与匹配结果过滤,例如以下代码:

代码语言:javascript
复制
my_template="""
<group 
name="interfaces_with_WIRELESS-IN_policy.{{ interface }}" functions="contains(policy)">
interface {{ interface }}
 service-policy input {{ policy | equal(WIRELESS_IN) }}
</group>
"""

from ttp import ttp
parser = ttp(template=my_template)
parser.parse()
print(parser.result(format="json")[0])

将产生以下结果:

代码语言:javascript
复制
[
    {
        "interfaces_with_WIRELESS-IN_policy": {
            "FastEthernet1/0/2": {
                "policy": "WIRELESS_IN"
            }
        }
    }
]

如何工作

TTP解析OP提供的文本数据,以提取接口和附加到它们的策略,而不进行任何过滤,将产生以下结果:

代码语言:javascript
复制
[
    {
        "interfaces_with_WIRELESS-IN_policy": {
            "FastEthernet1/0/1": {},
            "FastEthernet1/0/2": {
                "policy": "WIRELESS_IN"
            },
            "FastEthernet1/0/3": {
                "policy": "VOICE-LAN"
            }
        }
    }
]

但是通过使用匹配变量函数" equal“,我们可以指示TTP使不等于"WIRELESS_IN”的匹配结果无效,另外,在为group定义functions="contains(policy)“后,TTP将检查组结果(这是python字典)是否有名为"policy”的键,从而使没有这样的键的组匹配结果无效。

但是,上面的代码不会生成接口列表(根据OP的请求),直到您再应用一个TTP组函数- "itemize“-它将根据组结果创建一个项目列表,例如模板:

代码语言:javascript
复制
my_template="""
<group 
name="interfaces_with_WIRELESS-IN_policy" functions="contains(policy) | itemize(interface)">
interface {{ interface }}
 service-policy input {{ policy | equal(WIRELESS_IN) }}
</group>
"""

将发出以下结果:

代码语言:javascript
复制
[
    {
        "interfaces_with_WIRELESS-IN_policy": [
            "FastEthernet1/0/2"
        ]
    }
]
票数 1
EN

Stack Overflow用户

发布于 2013-10-02 00:56:38

代码语言:javascript
复制
    import re,string
f = open("sampleconfig.cfg")
cfgdata = f.read()
pat=re.compile('(interface.*?)!$',re.DOTALL|re.M)
pat2 = re.compile("service-policy.input.WIRELESS-IN")

data = pat.findall(cfgdata)
i=0
while i < len(data):
    if  pat2.findall(data[i]):
        print (data[i].split("\n")[0])
        i = i+1

    else:
        i = i+1
        pass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19101596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档