csv出力の配列として使用されるforループの変数

csv出力の配列として使用されるforループの変数

データセンター全体をcat6からcat6aに再接続する必要があるため、結果をカンマ区切りの列に整理することを目的としてソリューションを見つけようとしました。

$DBFILEの出力はaccess1a access1b ...です。

ターゲット:

    switch,switch-port,server,server-port
    access1a,1,server6,eth0
    access1a,2,server4,eth0
    access1a,3,server1,eth0

私の現在の出力は次のとおりです。

#!/bin/sh
DBFILE=$(cat /tmp/routers.all | awk -F: '{print $1}'| grep access)

for OUTPUT in $DBFILE
do
    /usr/bin/snmpwalk -Os -c pass -v 2c $OUTPUT iso.0.8802.1.1.2.1.4.1.1.8.0 | tr -d "\"" | sed -r 's/ /./g' |awk  -F. '{print "'"$OUTPUT"'"","$13","$22","}'
    /usr/bin/snmpwalk -Os -c pass -v 2c $OUTPUT iso.0.8802.1.1.2.1.4.1.1.9.0 | tr -d "\"" | sed -r 's/ /./g' |awk  -F. '{print "'"$OUTPUT"'"","$13","$17","}'
done

access1a,1,server6,
access1a,2,server4,
access1a,3,server1,
access1a,1,eth0,
access1a,2,eth0,
access1a,3,eth0,

私はさまざまな配列とforループのバリエーションを試しましたが、最後のクエリだけを取得したり、まったく動作しません。私は私が次のことをする方法を見つけることができないようだと尋ねると思いました。

答え1

単純な転送パスは、各呼び出しの出力をsnmpwalk変数に入れてから、次のようawkにいくつかのフィルタリングにリンクすることです。

#!/bin/sh
DBFILE=$(cat /tmp/routers.all | awk -F: '{print $1}'| grep access)

for OUTPUT in $DBFILE do
    FIRST_HALF=`/usr/bin/snmpwalk -Os -c pass -v 2c $OUTPUT iso.0.8802.1.1.2.1.4.1.1.8.0 | tr -d "\"" | sed -r 's/ /./g' |awk  -F. '{print "'"$OUTPUT"'"","$13","$22","}'`
    SECOND_HALF=`/usr/bin/snmpwalk -Os -c pass -v 2c $OUTPUT iso.0.8802.1.1.2.1.4.1.1.9.0 | tr -d "\"" | sed -r 's/ /./g' |awk  -F. '{print "'"$OUTPUT"'"","$13","$17","}' |awk 'BEGIN{FS=","}{print($3)}'`
    echo ${FIRST_HALF}${SECOND_HALF}
done

私はこれが結果だと思います。

access1a,1,server6,eth0
access1a,2,server4,eth0
access1a,3,server1,eth0

これは役に立ちますか?

公開:私はsnmpwalkに慣れていないので、より良いオプションがあるかもしれません。

答え2

私はsnmpwalkに慣れていませんが、質問(および以前の非効果的な答え)を見ると、数行の出力が生成されるようです。私が見ると、スクリプトの結果のほとんどは反復的または重複しているようです。つまり、常に次の形式の2行があります。

A,B,C
...
A,B,D

線の半分が次のように見える別の出力が必要です。

A,B,C,D

この場合、スクリプトをそのままにして、出力を次のAWKスクリプトにパイプする方が簡単になります。

BEGIN{
  FS=",";
}
{
  if ( ($1,$2) in A ) {
     print A[$1,$2] "," $3;
  } else {
     A[$1,$2]=$1 "," $2 "," $3;
  }
}

カットして貼り付けることができる1行の場合は、次のようになります。

| awk 'BEGIN{FS=","}{if ( ($1,$2) in A ) {print A[$1,$2] "," $3;} else {A[$1,$2]=$1 "," $2 "," $3;}}'

これは役に立ちますか?

関連情報