在Bash中解析SNMP输出

时间:2013-09-03 07:33:58

标签: linux bash

我需要处理以下命令的文本输出:

snmpwalk -v2c -c community 192.168.122.15 .1.3.6.1.4.1.14823.2.2.1.4.1.2.1.39

原始输出是:

SNMPv2-SMI::enterprises.14823.2.2.1.4.1.2.1.39.252.200.151.233.54.69.197.39.5.77 = STRING: "Android"

我需要输出看起来像

197.39.5.77="Android"

197.39.5.77=符号前的最后四位数字。

4 个答案:

答案 0 :(得分:2)

如果前缀完全是静态的,只需将其删除即可。

result=$(snmpwalk -v2c -c community 192.168.122.15 .1.3.6.1.4.1.14823.2.2.1.4.1.2.1.39)
result=${result#'SNMPv2-SMI::enterprises.14823.2.2.1.4.1.2.1.39.252.200.151.233.54.69.'}
echo "${result/ = STRING: /}"

或者你可以做到

oldIFS=$IFS
IFS=' .'
set $($(snmpwalk -v2c -c community 192.168.122.15 .1.3.6.1.4.1.14823.2.2.1.4.1.2.1.39)
IFS=$oldIFS
shift 16
result="$1.$2.$3.$4=$7"

shift${var/str/subst}构造的数字参数是Bashisms。

答案 1 :(得分:1)

使用sed

snmpwalk -v2c -c community 192.168.122.15 .1.3.6.1.4.1.14823.2.2.1.4.1.2.1.39 \
| sed -e 's/.*\.\([0-9]\+\(\.[0-9]\+\)\{3\}\).*\(".*"\)/\1=\3/'

bash正确:

snmpwalk -v2c -c community 192.168.122.15 .1.3.6.1.4.1.14823.2.2.1.4.1.2.1.39 \
| while read a b c; do echo ${a#${a%*.*.*.*.*}.}=\"${c#*\"}; done

答案 2 :(得分:0)

管道通过sed,如下所示:

$ snmpwalk -v2c -c community 192.168.122.15 .1.3.6.1.4.1.14823.2.2.1.4.1.2.1.39 | sed -r 's/.*\.([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) = .*: (.*)/\1=\2/g'
197.39.5.77="Android"

答案 3 :(得分:0)

尝试grep -Eo '(\.[0-9]{1,3}){4}\s*=.*$' | sed -r 'sed -r 's/\s*=[^:]+:/=/;s/^\.//'

第一部分是用一个好地址隔离行尾,然后是=; sed的第二部分将删除=:之间的任何字符串,并删除IPv4地址之前的第一个点。对于紧凑性,grep搜索4次点后跟最多3位数。