我在使用 snmpwalk 的输出中遇到问题,所以我在这个脚本中尝试:
var=`snmpwalk -v2c -c private ${ip} .1.1.1.6`
echo "${hostname}=>${var}"
得到这个输出:
R1=>Gauge32: 240
R1=>Gauge32: 293
R1=>Gauge32: 255
R1=>Gauge32: 25
但实际上我有这个输出:
R1=>Gauge32: 240
Gauge32: 293
Gauge32: 255
Gauge32: 25
那么我怎样才能在 bash 中获得我需要的输出
答案1
当您在字符串中存储的所有行之前打印主机名时,它无法按您想要的方式工作$var
。而不是在每行之前循环并打印主机名。
这是使用管道和 awk 循环它们的一种方法
snmpwalk -v2c -c private ${ip} .1.1.1.6 | awk -vHost="${hostname}" '{print Host"=>"$0}'
答案2
而不是将输出作为一个整体(带有嵌入的换行符)存储在标量变量,你可以(我没有说你应该) 将行存储在数组变量中。
在仿真中使用ksh93
, mksh
, , bash
:zsh
sh
IFS='
' # split on newline
set -f
var=($(snmpwalk -v2c -c private "$ip" .1.1.1.6))
然后使用printf
如下:
printf "$hostname=>%s\n" "${var[@]}"
但这假设$hostname
不包含百分比或反斜杠字符。
rc
并zsh
使其变得更容易:
rc
:var = (``(' '){snmpwalk -v2c -c private $ip .1.1.1.6}) printf %s\n $hostname'=>'^$var
zsh
:var=(${(f)"$(snmpwalk -v2c -c private $ip .1.1.1.6)"}) printf '%s\n' $hostname'=>'$^var
(请注意,所有这些解决方案都会忽略空行)
答案3
我认为将命令的整个输出分配给变量然后进行格式化并不是一个好主意。但如果您想这样做,您可以使用printf
来进行格式化。关键是hostname
在格式字符串内部展开,以便只有类型值对 invar
将受到格式说明符的影响(在本例中),并%s
保证每个数据对重用格式说明符:%d
printf
var=`snmpwalk -v2c -c private ${ip} .1.1.1.6`
printf "${hostname}=>%s %d\n" ${var}
${var}
(注意:这种情况下没有引号。)