我正在尝试从一个开关中解释以下输出。基本上,我希望它通过输出,直到它找到"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'发布于 2013-10-09 18:49:56
首先,你必须弄清楚格式是什么。然后,您可以编写代码来解析它。
显然,这是一种固定宽度的列格式.接口总是在前10个字符中,后面20个字符中的连接字符串,等等。因此,给定一行:
components = (line[:10], line[10:29], line[29:42], line[42:53], line[53:60],
line[60:67], line[67:])…会得到那些柱子。
因此,只需在行上循环,将每一行拆分成列,并找到正确的列:
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))如果您想要更一般的内容,只需编写一个列分裂函数,该函数接受一行和列边界序列。
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序列,而不是一组函数。更简洁一些,但可能不那么可读性:
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')https://stackoverflow.com/questions/19280006
复制相似问题