我正在使用paramiko登录设备并运行一些命令,然后仅捕获相关输出。代码的相关部分如下所示:
stdin, stdout, stderr = ssh.exec_command('show interface')
print stdout.read()
这给出了以下输出:
Ethernet interface 0:0
Internet address: 171.182.204.207 netmask 255.255.255.0
Internet address: fe80::2d0:83ff:fe06:4c67 prefixlen 64
MTU size: 1500
Link status: configured to full duplex, 1 gigabit/sec network
Member of the bridge: none
Ethernet interface 0:1
Internet address: fe80::2d0:83ff:fe06:4c66 prefixlen 64
MTU size: 1500
Link status: autosensed to full duplex, 1 gigabit/sec network
Member of the bridge: none
现在,我只想要链接状态,所以我这样做了:
stdin, stdout, stderr = ssh.exec_command('show interface')
link = '\n'.join(item for item in stdout.read().splitlines() if 'Link' in item)
print link
现在我明白了:
Link status: configured to full duplex, 1 gigabit/sec network
Link status: autosensed to full duplex, 1 gigabit/sec network
正常工作。但是,我想要的是在列表理解中指定事件,以便我只获得关键字Link的第一,第二或第n次出现。
答案 0 :(得分:2)
您有三种选择。
将所有项目存储在列表中,然后使用索引编制。但这会在内存中创建一个不必要的列表:
links = [item for item in stdout.read().splitlines() if 'Link' in item]
index = 5
print links[index]
或者使用itertools.islice
,并将您在代码中使用的生成器传递给它:
from itertools import islice
index = 5
links = (item for item in stdout.read().splitlines() if 'Link' in item)
print next(islice(links, index, index+1))
或者甚至更好地使用以下生成器itertools.islice
。在这里,我没有使用.read()
或.splitlines()
,因为他们将所有内容都读入内存:
links = (item for item in stdout if 'Link' in item)
print next(islice(links, index, index+1))
如果你只想在字符串的开头匹配item.startswith('Link')
,你也可以使用'Link'
,但是如果你想在字符串的任何地方匹配它,那么忽略它。
答案 1 :(得分:1)
为什么不直接索引列表理解?
links = [item for item in stdout.read().splitlines() if 'Link' in item]
print links[n] # index here
答案 2 :(得分:1)
occurence = 2
link = [item for item in stdout.read().splitlines() if 'Link' in item][occurence]