我一直在努力想出一个解决方案,目标是将结果组织成逗号分隔的列,因为我们必须将整个数据中心从 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;}}'
这有帮助吗?