通过 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”,依此类推。我创建了一个不工作但仍打印一些数据的循环。在我看来,最好的解决方案是将每个变量转换为数组并按顺序遍历元素。
- 获取每个输入变量并将其转换为数组的正确方法是什么?每个变量的输入范围从 2 到 16。我需要考虑这个动态大小
- 请看我的
for
循环。如何在保持输出格式的同时简化它?多次更改造成的混乱
- 如果我使用
IFS
获取数据并将其放入数组中,我需要更改什么?
您可以通过var=( $var )
将变量(space定界)设为数组,但我没有完全理解您的问题。
如果您编辑了 post 并在结尾处总结了您想要的内容,那将会很有帮助。
编辑(根据评论):
如果您的字段由“\n”分隔:
var1=`echo $var1 | tr "\n" " "`
var1=( $var1 )
我还没有太多 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”,依此类推。我创建了一个不工作但仍打印一些数据的循环。在我看来,最好的解决方案是将每个变量转换为数组并按顺序遍历元素。
- 获取每个输入变量并将其转换为数组的正确方法是什么?每个变量的输入范围从 2 到 16。我需要考虑这个动态大小
- 请看我的
for
循环。如何在保持输出格式的同时简化它?多次更改造成的混乱 - 如果我使用
IFS
获取数据并将其放入数组中,我需要更改什么?
您可以通过var=( $var )
将变量(space定界)设为数组,但我没有完全理解您的问题。
如果您编辑了 post 并在结尾处总结了您想要的内容,那将会很有帮助。
编辑(根据评论):
如果您的字段由“\n”分隔:
var1=`echo $var1 | tr "\n" " "`
var1=( $var1 )