2017-12-07 1 views
0

私はPythonには新しく、印刷出力を行と列に書式設定する際の助けが必要です。このデータは最終的にcsvファイルに送られます。PYsnmp 4.4の複数行の書式設定行と列への出力Python 2.7

スクリプトは複数のホストからデータを取得します。行数は可変であり、インターフェース名と記述の長さも変わります。

現在の出力は次のようになります。

hostname IF-MIB::ifDescr.1 = GigabitEthernet0/0/0<br/> 
hostname IF-MIB::ifAlias.1 = --> InterfaceDesc<br/> 
hostname IF-MIB::ifOperStatus.1 = 'up'<br/> 
hostname IF-MIB::ifDescr.2 = GigabitEthernet0/0/1<br/> 
hostname IF-MIB::ifAlias.2 = --> InterfaceDesc<br/> 
hostname IF-MIB::ifOperStatus.2 = 'up'<br/> 
hostname IF-MIB::ifDescr.3 = GigabitEthernet0/0/2<br/> 
hostname IF-MIB::ifAlias.3 = --> InterfaceDesc<br/> 
hostname IF-MIB::ifOperStatus.3 = 'up'<br/> 

私は、各行(ホスト名、インタフェース、インタフェースDESC、およびステータス)のヘッダに以下の行と列にそれをフォーマットしようとしています。

hostname  interface    interface desc  status 
hostname  GigabitEthernet0/0/0 InterfaceDesc  up 
hostname  GigabitEthernet0/0/1 InterfaceDesc  up 
hostname  GigabitEthernet0/0/2 InterfaceDesc  up 

現在の印刷コードはこちらです。私は印刷文に誤りがないようにしたい。

for errorIndication, errorStatus, errorIndex, varBinds in snmp_iter: 
      # Check for errors and print out results 
      if errorIndication: 
       print(errorIndication) 
      elif errorStatus: 
       print('%s at %s' % (errorStatus.prettyPrint(), 
           errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) 
      else: 
       for varBind in varBinds: 
        print(hostip), 
        print(' = '.join([x.prettyPrint() for x in varBind])) 

全スクリプト:あなたが提供できるすべてのヘルプははるかに高く評価され

from pysnmp.hlapi import * 

routers = ["router1"] 

#adds routers to bulkCmd 
def snmpquery (hostip): 
    snmp_iter = bulkCmd(SnmpEngine(), 
         CommunityData('Community'), 
         UdpTransportTarget((hostip, 161)), 
         ContextData(), 
         0, 50, # fetch up to 50 OIDs 
         ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')), 
         ObjectType(ObjectIdentity('IF-MIB', 'ifAlias')), 
         ObjectType(ObjectIdentity('IF-MIB', 'ifOperStatus')), 
         lexicographicMode=False) # End bulk request once outside of OID child objects 
    for errorIndication, errorStatus, errorIndex, varBinds in snmp_iter: 
     # Check for errors and print out results 
     if errorIndication: 
      print(errorIndication) 
     elif errorStatus: 
      print('%s at %s' % (errorStatus.prettyPrint(), 
          errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) 
     else: 
      for rowId, varBind in enumerate(varBindTable): 
       oid, value = varBind 
       print('%20.20s' % value) 
       if not rowId and rowId % 3 == 0: 
        print('\n') 

# calls snmpquery for all routers in list 
for router in routers: 
    snmpquery(router) 

。 ありがとう!

答えて

0

snmp_iterは、3つのSNMPテーブルの列で初期化されると仮定すると:

snmp_iter = bulkCmd(SnmpEngine(), 
        UsmUserData('usr-md5-des', 'authkey1', 'privkey1'), 
        Udp6TransportTarget(('demo.snmplabs.com', 161)), 
        ContextData(), 
        0, 25, 
        ObjectType(ObjectIdentity('IF-MIB', 'ifDescr')), 
        ObjectType(ObjectIdentity('IF-MIB', 'ifAlias')), 
        ObjectType(ObjectIdentity('IF-MIB', 'ifOperStatus'))) 

あなたはpysnmpは常に行のファッションで行の長方形のテーブルを返します(GETNEXTGETBULKのためコマンド)ことを確認することができます。

あなたが要求した列の数を知る(3)あなたは、行で出力行を印刷することができる必要があります:

for rowId, varBind in enumerate(varBindTable): 
    oid, value = varBind 
    print('%20.20s' % value) 
    if not rowId and rowId % 3 == 0: 
     print('\n') 
+0

おかげIIya、私はvarBindTableを定義し、それを変数バインディングの値を割り当てる必要がありますか? – Ev9432

+0

すぐに送信してください。はいsnmp_interは3つのSNMPテーブルで初期化されます。私は完全なスクリプトを追加しました – Ev9432

関連する問題