我还没有太多关于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”中获取元素,依此类推。我创建了一个不起作用的循环,但仍然打印了一些数据。在我天真的意见中,最好的解决方案是将每个变量转换为一个数组,并按顺序迭代元素。
for
循环。如何在保持输出格式的同时简化它?多次改变是一团糟IFS
获取数据并将其放入数组中,我需要更改哪些内容?答案 0 :(得分:0)
你可以通过var=( $var )
创建一个变量(空格分隔)数组,但我没有完全解答你的问题。
如果您编辑了帖子并在最后总结了您想要的内容,那将会很有帮助。
修改(根据评论):
如果您的字段由&#39; \ n&#39;:
分隔var1=`echo $var1 | tr "\n" " "`
var1=( $var1 )