如何将Cisco IOS输出解析为对象或JSON

2024-04-29 19:10:40 发布

您现在位置:Python中文网/ 问答频道 /正文

{1{我想得到的是一个简单的列表,但我现在可以得到一个简单的列表。脚本下面的示例输出。注意到“VLAN”中的“V”是如何作为自己的项捕获到这个中的?在

我也在想,是否有更好的方法来实现这一点,也许我可以包括一个库来处理将表格数据转换成字典之类的。在

#!/usr/bin/python
import re
import sys

data = """
VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Fa0/2, Fa0/3, Fa0/4, Fa0/5, Fa0/6, Fa0/7
                                                Fa0/8, Fa0/9, Fa0/10, Fa0/11, Fa0/12
                                                Fa0/13, Fa0/14, Fa0/15, Fa0/16, Fa0/17
                                                Fa0/18, Fa0/19, Fa0/20, Fa0/21, Fa0/22
                                                Fa0/23, Fa0/24, Gi0/2
1002 fddi-default                     act/unsup
1003 token-ring-default               act/unsup
1004 fddinet-default                  act/unsup
1005 trnet-default                    act/unsup
"""

lines = re.split("\n([^\s])", data)
print lines

输出:

['', 'V', 'LAN Name Status Ports', '-', '--- -------------------------------- --------- -------------------------------', '1', ' default active Fa0/2, Fa0/3, Fa0/4, Fa0/5, Fa0/6, Fa0/7\n
Fa0/8, Fa0/9, Fa0/10, Fa0/11, Fa0/12\n
Fa0/13, Fa0/14, Fa0/15, Fa0/16, Fa0/17\n
Fa0/18, Fa0/19, Fa0/20, Fa0/21, Fa0/22\n
Fa0/23, Fa0/24, Gi0/2', '1', '002 fddi-default
act/unsup', '1', '003 token-ring-default act/unsup', '1', '004 fddinet-default act/unsup', '1', '005 trnet-default act/unsup\n']

谢谢!在

编辑lines = re.findall(".*[^\n\W]*", data)似乎这是一个更好的方法(很抱歉,这不起作用),但这整件事还是让人觉得很不好,所以我很乐意听听其他的建议。在


Tags: 方法nameimportredefault列表datastatus
3条回答

这些天我建议查看一个专用的现有库来进行解析。我发现的一个这样的示例库是ciscoconfparse,它将把一个IOS配置(和其他一些配置)解析为line对象,这些对象维护了对配置操作有用的子/父行关系。在

这可能不是最好的办法,但至少是一个解决办法。使用regex模块而不是re模块。在

lines = regex.split("\n(?=[^\s])", data)

与内置的re模块不同,regex模块允许在零宽度匹配时进行拆分,因此可以使用lookahead在下一个字符匹配的位置进行拆分。在

参考文献:

NTC Templates提供一组模板来解析各种Cisco IOS命令输出(和其他网络设备)。模板与TextFSM一起工作来进行实际的解析。在

例如:

>>> from ntc_templates.parse import parse_output
>>> vlan_output = (
        "VLAN Name                             Status    Ports\n"
        "---- -------------------------------- --------- -------------------------------\n"
        "1    default                          active    Gi0/1\n"
        "10   Management                       active    \n"
        "50   VLan50                           active    Fa0/1, Fa0/2, Fa0/3, Fa0/4, Fa0/5,\n"
        "                                                Fa0/6, Fa0/7, Fa0/8\n"
    )
>>> vlan_parsed = parse_output(platform="cisco_ios", command="show vlan", data=vlan_output)
>>> vlan_parsed
[
    {
        'vlan_id': '1',
        'name': 'default',
        'status': 'active',
        'interfaces': ['Gi0/1']
    },
    {
        'vlan_id': '10',
        'name': 'Management',
        'status': 'active',
        'interfaces': []
    },
    {
        'vlan_id': '50',
        'name': 'VLan50', 'status': 'active',
        'interfaces': ['Fa0/1', 'Fa0/2', 'Fa0/3', 'Fa0/4', 'Fa0/5', 'Fa0/6', 'Fa0/7', 'Fa0/8']
    }
]
>>> 

相关问题 更多 >