在Python中解析Cisco输出

2024-06-16 11:51:17 发布

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

我试图解释开关的以下输出。基本上,我希望它遍历输出,直到找到“notconnect”,然后将接口的名称存储在数组中。然后继续遍历该文件,并将下一个“notconnect”接口存储为数组中的下一个元素。下例中的接口是Gi1/0/4。我只是不知道从哪里开始。任何帮助都将不胜感激。我使用的是python3.3.2。在

b'\r\n\r\nMS-2673-DC-CS01#terminal length 0\r\nMS-2673-DC-CS01#sh interface status\r\n\r\nPort      Name               Status       Vlan       Duplex  Speed Type\r\nGi1/0/1   Connection to MS-2 connected    trunk      a-full a-1000 1000BaseSX SFP\r\nGi1/0/2   Connection to MS-2 connected    trunk      a-full a-1000 1000BaseSX SFP\r\nGi1/0/3   Connection to MS-2 connected    trunk      a-full a-1000 1000BaseSX SFP\r\nGi1/0/4                      notconnect   trunk        auto   auto Not Present\r\nGi1/0/5   Connection to MS-2 connected    trunk      a-full a-1000 1000BaseSX SFP\r\nGi1/0/6   Connection to MS-2 connected    trunk      a-full a-1000 10/100/1000BaseTX SFP\r\nGi1/0/7   Connection to MS-2 connected    trunk      a-full a-1000 10/100/1000BaseTX SFP\r\nGi1/0/8   Connection to MS-2 connected    trunk      a-full a-1000 10/100/1000BaseTX SFP\r\nGi1/0/9   Connection to MS-2 connected    trunk      a-full a-1000 10/100/1000BaseTX SFP\r\nGi1/0/10  Connection to MS-2 connected    trunk      a-full a-1000 10/100/1000BaseTX SFP\r\nGi1/0/11  Connection to MS-2 connected    trunk      a-full a-1000 10/100/1000BaseTX SFP\r\nGi1/0/12  Connection Server  connected    32         a-full a-1000 10/100/1000BaseTX SFP\r\nMS-2673-DC-CS01#exit\r\n'

Tags: to名称auto数组connectiondcfullms
1条回答
网友
1楼 · 发布于 2024-06-16 11:51:17

首先,你必须弄清楚是什么格式。然后可以编写代码来解析它。在

显然,这是一种固定宽度的列格式。接口总是在前10个字符中,连接字符串在后20个字符中,等等。因此,给定一行:

components = (line[:10], line[10:29], line[29:42], line[42:53], line[53:60],
              line[60:67], line[67:])

…将得到列。在

所以,只需循环这些行,将每行拆分成列,然后找到正确的行:

^{pr2}$

如果您想要更一般的东西,只需编写一个列拆分函数,它接受一行和一系列列边界。在

def parse_line(line, columns):
    for start, stop in zip(columns, columns[1:])
        yield line[start, stop].rstrip()

def parse_log(log):
    for line in log.splitlines():
        yield list(parse_line(line, (0, 10, 29, 42, 53, 60, 67, 80)))

def find_notconnected(log):
    for port, name, status, vlan, duplex, speed, type in parse_log(log):
        if status == 'notconnect':
            yield port

您也可以将其转换为genexpr序列,而不是一组函数。稍微简洁一点,但可能读不到:

bounds = (0, 10, 29, 42, 53, 60, 67, 80)
columns = ([line[start:stop].rstrip() for start, stop in zip(bounds, bounds[1:])]
           for line in log.splitlines())
notconnected = (port for port, _, status, _, _, _, _ in columns 
                if status == 'notconnected')

相关问题 更多 >