for 循环中的变量用作 csv 输出的数组

for 循环中的变量用作 csv 输出的数组

我一直在努力想出一个解决方案,目标是将结果组织成逗号分隔的列,因为我们必须将整个数据中心从 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 但从问题(以及我以前的无效答案)看来它会产生几行输出。在我看来,脚本的大部分结果都是重复/冗余的,即总是有两行格式为:

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;
  }
}

对于可以剪切和粘贴的单行,它看起来像这样。

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

这有帮助吗?

相关内容