通过 Bash 从 SNMPWALK 请求中获取多个字符串,但不确定如何格式化输出

Getting multiple strings from SNMPWALK requests via Bash but unsure how to format for output

我还没有太多 bash 的经验,我正在边学边学。在工作中,我们需要使用 SNMP 从无线接入点提取数据。我的任务是制作一个脚本来循环访问几千个接入点。


我通过 SNMPWALK 按顺序请求提取多个数据字符串。这就是我设置输入的方式:

IAP=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapName -Oqv)
MODEL=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::arrayModel -Oqv | cut -d ',' -f1)
CHANNEL=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapChannel -Oqv)
MAXHOUR=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMaxStationsHour -Oqv)
MAXDAY=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMaxStationsDay -Oqv)
MAXWEEK=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMaxStationsWeek -Oqv)
MAXMONTH=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMaxStationsMonth -Oqv)
MAXYEAR=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMaxStationsYear -Oqv)
MAC=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMacAddress -Oqv)

这是通过 echo 打印的输入示例:

iap1
iap2
iap3
iap4
iap5
iap6
iap7
iap8

XR4820

6
100
11
149
64
112
36
161

9
2
7
2
2
1
3
2

11
5
9
4
8
3
3
3

22
9
21
4
12
4
16
5

24
23
21
5
12
8
20
11

24
23
21
5
12
8
20
11

00:0f:7d:ea:b1:00-01
00:0f:7d:ea:b1:10-11
00:0f:7d:ea:b1:20-21
00:0f:7d:ea:b1:30-31
00:0f:7d:ea:b1:40-41
00:0f:7d:ea:b1:50-51
00:0f:7d:ea:b1:60-61
00:0f:7d:ea:b1:70-71

我需要获取数据并将其输出为 CSV。问题是我必须按顺序排列它们(例如 MODEL[0]、CHANNEL[0]、...、MAC[0]、MODEL[1]、CHANNEL[1]、... ).我似乎无法正确执行此操作。

我尝试按照 Whosebug 中其他答案的建议使用 IFS。我尝试创建一个 for 循环来遍历元素:

IAP=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapName -Oqv)

if [ "$IAP" != "No Such Instance currently exists at this OID" ]
then

    MODEL=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::arrayModel -Oqv | cut -d ',' -f1)

    CHANNEL=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapChannel -Oqv)
    IFS=' ' read -a CHANNEL <<< "$CHANNEL"

    MAXHOUR=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMaxStationsHour -Oqv)
    IFS=' ' read -a MAXHOUR <<< "$MAXHOUR"

    MAXDAY=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMaxStationsDay -Oqv)
    IFS=' ' read -a MAXDAY <<< "$MAXDAY"

    MAXWEEK=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMaxStationsWeek -Oqv)
    IFS=' ' read -a MAXWEEK <<< "$MAXWEEK"

    MAXMONTH=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMaxStationsMonth -Oqv)
    IFS=' ' read -a MAXMONTH <<< "$MAXMONTH"

    MAXYEAR=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMaxStationsYear -Oqv)
    IFS=' ' read -a MAXYEAR <<< "$MAXYEAR"

    MAC=$(snmpwalk -v 2c -c $COMMUNITY $DEVICE XIRRUS-MIB::iapMacAddress -Oqv)      
    IFS=' ' read -a MAC <<< "$MAC"

    for ((i=0; i<${#IAP[@]}; ++i));
    do
        ia=${IAP[$i]}
        m=${MAC[$i]}
        c=${CHANNEL[$i]}
        h=${MAXHOUR[$i]}
        d=${MAXDAY[$i]}
        w=${MAXWEEK[$i]}
        mon=${MAXMONTH[$i]}
        y=${MAXYEAR[$i]}

        if [ -n "$m" ]
        then

            TEMP="$MODEL,$ia,$c,$h,$d,$w,$mon,$y"
            if [ $i -gt 1 ]
            then
                OUTPUT=",$OUTPUT,$TEMP"
            else
                OUTPUT="$TEMP"
            fi

        fi
    done

然而,这是输出:

XR4820,iap1
iap2
iap3
iap4
iap5
iap6
iap7
iap8,11,8,11,11,11,11

虽然应该是:

iap1,6,9,11,22,24,24,iap2,100,2,5,9,23,23,iap3,...

总结:

我的输入是一些长字符串,我需要对其进行解析并将元素发送到 .CSV 文件。他们需要井然有序,即。从每个元素中获取元素“0”,然后是元素“1”,依此类推。我创建了一个不工作但仍打印一些数据的循环。在我看来,最好的解决方案是将每个变量转换为数组并按顺序遍历元素。

您可以通过var=( $var )将变量(space定界)设为数组,但我没有完全理解您的问题。

如果您编辑了 post 并在结尾处总结了您想要的内容,那将会很有帮助。

编辑(根据评论):

如果您的字段由“\n”分隔:

var1=`echo $var1 | tr "\n" " "`
var1=( $var1 )