Snmpwalk Linux Bash不返回数组

我运行一个nagios服务器上的opensuse linux通过snmp连接到esx 3.5服务器

我试图让snmpwalk返回一个数组,但它只返回一个值。

在esx盒子上,我用下面的shell来查找所有快照的大小 –

/usr/bin/find /vmfs/volumes/ -name '*delta*.vmdk' -printf %f' '%s'\n' 

这在esx框上运行时返回以下内容 –

 [root@localhost root]# /bin/sh /etc/snmp/snmp_snapshots.sh testnag01-000001-delta.vmdk 16840704 testnag01-000002-delta.vmdk 167835648 testnag01-000003-delta.vmdk 151058432 

在nagios盒子上,我有以下shell –

 declare -a RESULT=$(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g') echo "snapshot 1" ${RESULT[0]} echo "snapshot 2" ${RESULT[1]} 

这只返回一个值,(列表中的第二个) –

 snapshot 1 testnag01-000002-delta.vmdk:167835648 snapshot 2 

当我自己运行命令时,

 /usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 

我得到以下回报 –

 SNMPv2-SMI::enterprises.6876.57.101.2 = STRING: "testnag01-000002-delta.vmdk 167835648" 

所以看起来命令本身没有返回多个结果?

我在这里是一个小菜,所以我很可能会错过一些明显的东西…

提前致谢

我在其他地方得到了答案,但是以为我会在这里张贴,以防其他人有同样的问题 –

OID中的最后一个数字返回记录编号 – 所以.2返回第二个值

一旦我删除了这个.2,

/ usr / bin / snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.1​​01

它工作正常!

你忘了把你的值放在()中:

 declare -a RESULT=($(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g')) 

为了防止可能的pathname expansion ,建议使用read来代替:

 declare -a RESULT IFS=$' \t\n' read -rd '' -a RESULT < <(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g') 

如果您要逐行阅读,请使用readarrayprocess substitution

 readarray -t RESULT < <(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g') 

或者here stringscommand substitution

 readarray -t RESULT <<< "$(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g')" 

你也可以while read循环的时候使用:

 declare RESULT=() while read -r LINE; do RESULT[${#RESULT[@]}]=$LINE done < <(/usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | grep vmdk | awk {' print $4,$5 '} | sed 's/ /_size:/g' | sed 's/\"//g') 

你的命令更简单的方法是:

 /usr/bin/snmpwalk -v 2c -c public 10.10.0.20 .1.3.6.1.4.1.6876.57.101.2 | awk -F '"' '/vmdk/{ t = $2; sub(/ /, "_size:", t); print t; }'