我已经检查过文档但什么也没看到——有人知道是否有可能转义某些 OID 返回的换行符吗?
我需要解析脚本中的输出,这让我很头疼。
例如:
$ snmpwalk -v2c -c public -Oq 10.0.0.1 1.3.6.1.2.1.1
SNMPv2-MIB::sysDescr.0 Cisco Internetwork Operating System Software
IOS (tm) Catalyst 4000 L3 Switch Software (cat4000-I5S-M), Version 12.2(18)EW4, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2005 by cisco Systems, Inc.
Com
SNMPv2-MIB::sysObjectID.0 SNMPv2-SMI::enterprises.9.1.502
DISMAN-EVENT-MIB::sysUpTimeInstance 122:19:10:46.16
SNMPv2-MIB::sysContact.0 012345
SNMPv2-MIB::sysName.0 name
SNMPv2-MIB::sysLocation.0 London,uk,emea
在我的代码中,我可以解析输出的每一行,并在第一个空格处将其拆分,直到我得到像上面的 sysDescr OID 这样的多行响应为止。如果有某种方法可以在响应中实际打印 \n 而不是真正的新行,那就太好了。
答案1
您可以尝试通过此sed
脚本传输您的输出:
$ snmpwalk ... | sed -n '/MIB::/!{H;$g};/MIB::/{$!x;s/\n/\\n/g;ta;${x;/^$/!p;x};:a;/^$/!p}'
SNMPv2-MIB::sysDescr.0 Cisco Internetwork Operating System Software\nIOS (tm) Catalyst 4000 L3 Switch Software (cat4000-I5S-M), Version 12.2(18)EW4, RELEASE SOFTWARE (fc1)\nTechnical Support: http://www.cisco.com/techsupport\nCopyright (c) 1986-2005 by cisco Systems, Inc.\nCom
SNMPv2-MIB::sysObjectID.0 SNMPv2-SMI::enterprises.9.1.502
DISMAN-EVENT-MIB::sysUpTimeInstance 122:19:10:46.16
SNMPv2-MIB::sysContact.0 012345\nfoo\nbar
SNMPv2-MIB::sysName.0 name
SNMPv2-MIB::sysLocation.0 London,uk,emea
下面是一个更易读的 AWK 版本,但稍微长一些:
$ snmpwalk ... | awk 'function printit() {printf prev; if (accum) printf "\\n" accum; print ""} !/MIB::/{accum=accum "\\n" $0} /MIB::/{if (NR>1) {printit()}; accum=""; prev=$0} END{printit()}'
答案2
- 尝试:snmpwalk--hexOutputLength = 1024 .....
- 或者禁用换行符:snmpwalk--hexOutputLength = 0 .....
参考:
https://it.sourceforge.net/p/net-snmp/mailman/message/16868020/
http://net-snmp.sourceforge.net/docs/man/snmp.conf.html