首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析来自4个数据源的打印输出

解析来自4个数据源的打印输出
EN

Stack Overflow用户
提问于 2014-09-22 03:02:55
回答 1查看 178关注 0票数 0

编辑:抱歉耽搁了..。这仍然给我带来了麻烦-

代码语言:javascript
复制
Traceback (most recent call last):
  File "snmp1.py", line 18, in <module>
    print_snmp_event(varBindTableRow)
  File "snmp1.py", line 7, in print_snmp_event
    print '{1} = {3}'.format(*data)
IndexError: tuple index out of range

这就是我尝试运行您最新的建议时得到的输出。

我有问题,正确地打印这个,我正在路由器上运行SNMP,我得到以下输出作为打印输出。我正在使用pysnmp将这些数据发送到路由器。

代码语言:javascript
复制
from pysnmp.entity.rfc3413.oneliner import cmdgen

cmdGen = cmdgen.CommandGenerator()
varBindTable = cmdGen.nextCmd(
        cmdgen.CommunityData('STRING'),
        cmdgen.UdpTransportTarget(('router', 161)),
        '1.3.6.1.2.1.2.2.1.2','1.3.6.1.2.1.2.2.1.14'
)


for varBindTableRow in varBindTable:
    print varBindTableRow

我的输出是

代码语言:javascript
复制
[(ObjectName(1.3.6.1.2.1.2.2.1.2.222), OctetString('Gi4/2')), (ObjectName(1.3.6.1.2.1.2.2.1.15.215), Counter32(0))] 

我想得到的是

代码语言:javascript
复制
Gi4/2 = 0

我想我可以打印出来1,3,但不起作用。有人有什么建议吗?

对不起,这是输出:

代码语言:javascript
复制
print type(varBindTableRow[0])
TypeError: 'NoneType' object has no attribute '__getitem__'
print type(varBindTableRow[0][0])
TypeError: 'NoneType' object has no attribute '__getitem__'
print repr(varBindTableRow)
[[(ObjectName(1.3.6.1.2.1.2.2.1.2.1), OctetString('FastEthernet0/0')), (ObjectName(1.3.6.1.2.1.2.2.1.14.1), Counter32(0))],
print repr(varBindTableRow[0])
TypeError: 'NoneType' object has no attribute '__getitem__'
print repr(varBindTableRow[0][0])
TypeError: 'NoneType' object has no attribute '__getitem__'

当我运行您给出的脚本时,我得到以下内容:

代码语言:javascript
复制
Traceback (most recent call last):
  File "snmp_pull.py", line 18, in <module>
    print_snmp_event(varBindTableRow)
  File "snmp_pull.py", line 7, in print_snmp_event
    print '{1} = {3}'.format(*data)
IndexError: tuple index out of range

再次感谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2014-09-22 05:41:35

我假设SNMP事件是您的程序试图解析的字符串。如果是这样,您可以使用regex模式提取所需的内容,如下所示。

代码语言:javascript
复制
#! /usr/bin/env python

import re

snmp_event = "[(ObjectName(1.3.6.1.2.1.2.2.1.2.222), OctetString('Gi4/2')), (ObjectName(1.3.6.1.2.1.2.2.1.15.215), Counter32(0))]"

print snmp_event

pat = re.compile(r'\w+\((.*?)\)')
data = pat.findall(snmp_event)

print '{1} = {3}'.format(*data)

输出:

代码语言:javascript
复制
[(ObjectName(1.3.6.1.2.1.2.2.1.2.222), OctetString('Gi4/2')), (ObjectName(1.3.6.1.2.1.2.2.1.15.215), Counter32(0))]
'Gi4/2' = 0

编辑

阿拉丁,我让你把这些信息粘贴到你原来的问题中,因为在评论中很难读到这样的信息,因为非常

但我现在意识到我犯了个小错误:我应该让你这么做的:

代码语言:javascript
复制
    print type(varBindTableRow[0])
    print type(varBindTableRow[0][0])
    print repr(varBindTableRow)
    print repr(varBindTableRow[0])
    print repr(varBindTableRow[0][0])

它必须进入您的for循环。

真对不起。我从你的评论中得到了一点信息。所以试试这个。我不能保证它能工作,也不能测试它,因为我没有SNMP的东西。

代码语言:javascript
复制
import re
from pysnmp.entity.rfc3413.oneliner import cmdgen

def print_snmp_event(row):
    pat = re.compile(r'\w+\((.*?)\)')
    data = pat.findall(str(row))
    print '{1} = {3}'.format(*data)


cmdGen = cmdgen.CommandGenerator()
varBindTable = cmdGen.nextCmd(
        cmdgen.CommunityData('STRING'),
        cmdgen.UdpTransportTarget(('router', 161)),
        '1.3.6.1.2.1.2.2.1.2','1.3.6.1.2.1.2.2.1.14'
)

for varBindTableRow in varBindTable:
    print_snmp_event(varBindTableRow)

请让我知道它是否有效,如果它不起作用,请将结果粘贴到您的问题中(缩进以保留行,就像粘贴代码一样),将而不是粘贴到注释中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25966152

复制
相关文章

相似问题

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