首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python解析Cisco输出

用Python解析Cisco输出
EN

Stack Overflow用户
提问于 2013-10-09 18:38:31
回答 1查看 2.7K关注 0票数 0

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

代码语言:javascript
复制
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'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-09 18:49:56

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

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

代码语言:javascript
复制
components = (line[:10], line[10:29], line[29:42], line[42:53], line[53:60],
              line[60:67], line[67:])

…会得到那些柱子。

因此,只需在行上循环,将每一行拆分成列,并找到正确的列:

代码语言:javascript
复制
def parse_log(log)
    for line in log.splitlines():
        if line[29:42].rstrip() == 'notconnect':
            yield line[:10].rstrip()

notconnect_interfaces = list(parse_log(log))

如果您想要更一般的内容,只需编写一个列分裂函数,该函数接受一行和列边界序列。

代码语言:javascript
复制
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

您也可以将其转换为genexprs序列,而不是一组函数。更简洁一些,但可能不那么可读性:

代码语言:javascript
复制
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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19280006

复制
相关文章

相似问题

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