Bashのsnmpwalkループ

Bashのsnmpwalkループ

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を使用してループを繰り返す1つの方法は次のとおりです。

snmpwalk -v2c -c private ${ip} .1.1.1.6 | awk -vHost="${hostname}" '{print Host"=>"$0}'

答え2

出力を完全に(改行文字を含む)保存する代わりにスカラー変数、あなたはできます(私はあなたを言わなかったしなければならない)行を配列変数に保存します。

シミュレーションでksh93、、、、mksh使用bashzshsh

IFS='
' # split on newline
set -f
var=($(snmpwalk -v2c -c private "$ip" .1.1.1.6))

次に、次のように使用しますprintf

printf "$hostname=>%s\n" "${var[@]}"

ただし、これは$hostnameパーセントまたはバックスラッシュ文字が含まれていないと仮定します。

rczshより簡単にしてください。

  • 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フォーマット文字列の内部を拡張することによってタイプ値ペアはvar書式指定子の影響を受け(この場合)、%s各データペアに対して書式指定子を再利用することが保証されます。%dprintf

var=`snmpwalk -v2c -c private ${ip} .1.1.1.6`
printf "${hostname}=>%s %d\n" ${var}

${var}(注:この場合は引用符はありません。)

関連情報