在Bash中parsingSNMP输出

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

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=符号前的最后四位数字。

如果前缀是完全静态的,只要删除它。

 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。

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 abc; do echo ${a#${a%*.*.*.*.*}.}=\"${c#*\"}; done 

通过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" 

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

第一部分是用一个好的地址隔开行的末尾,后跟= ; 第二部分用sed擦除=和之间的任何字符串,并且擦除IPv4地址之前的第一个点。 为了紧凑, grep搜索4个点,最多3个数字。