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

时间:2015-01-22 21:10:55

标签: arrays bash terminal string-parsing

我还没有太多关于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],...)。我似乎无法正确地做到这一点。

我尝试使用stackoverflow中其他答案所建议的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”中获取元素,依此类推。我创建了一个不起作用的循环,但仍然打印了一些数据。在我天真的意见中,最好的解决方案是将每个变量转换为一个数组,并按顺序迭代元素。

  • 获取每个输入变量并将其转换为数组的正确方法是什么?每个变量的输入范围为2到16.我需要考虑这个动态大小调整
  • 请查看我的for循环。如何在保持输出格式的同时简化它?多次改变是一团糟
  • 如果我使用IFS获取数据并将其放入数组中,我需要更改哪些内容?

1 个答案:

答案 0 :(得分:0)

你可以通过var=( $var )创建一个变量(空格分隔)数组,但我没有完全解答你的问题。

如果您编辑了帖子并在最后总结了您想要的内容,那将会很有帮助。

修改(根据评论):

如果您的字段由&#39; \ n&#39;:

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