Простой скрипт для помещения результатов snmpbulkwalk в переменные, как я могу поместить все данные в 2 массива? - PullRequest
0 голосов
/ 06 мая 2020

Я сделал простой скрипт для представления Cacti Graph, и он работает, но, очевидно, он не совсем оптимизирован, потому что я делаю 8 запросов с snmpbulkwalk и разбиваю его по номеру строки (FNR == x), в то время как я мог бы выполнил всего 2 запроса, используя 2 массива, один для первого OID, а другой для второго OID. Я задаю себе этот вопрос, потому что, очевидно, для Cacti, чем быстрее сценарий, тем лучше Poller может обрабатывать ввод данных.

#!/bin/bash
#hwCBQoSIfQueueMatchedBytes
qos_match_2=$(snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.2 | awk 'FNR==2 {print $4}')
qos_match_3=$(snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.2 | awk 'FNR==3 {print $4}')
qos_match_4=$(snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.2 | awk 'FNR==4 {print $4}')
#hwCBQoSIfQueueDiscardedBytes
dis_match_2=$(snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.6 | awk 'FNR==2 {print $4}')
dis_match_3=$(snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.6 | awk 'FNR==3 {print $4}')
dis_match_4=$(snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.6 | awk 'FNR==4 {print $4}')

printf "qos_match_2:$qos_match_2 "
printf "qos_match_3:$qos_match_3 "
printf "qos_match_4:$qos_match_4 "
printf "dis_match_2:$dis_match_2 "
printf "dis_match_3:$dis_match_3 "
printf "dis_match_4:$dis_match_4 "
printf "\n"

Пример вывода команды snmpbulkwalk на хосте будет :

SNMPv2-SMI::enterprises.2011.5.25.32.1.1.5.1.6.1.2.3.2.1 = Counter64: 0
SNMPv2-SMI::enterprises.2011.5.25.32.1.1.5.1.6.1.2.3.2.2 = Counter64: 431032480
SNMPv2-SMI::enterprises.2011.5.25.32.1.1.5.1.6.1.2.3.2.3 = Counter64: 12456864036
SNMPv2-SMI::enterprises.2011.5.25.32.1.1.5.1.6.1.2.3.2.4 = Counter64: 69821418510
SNMPv2-SMI::enterprises.2011.5.25.32.1.1.5.1.6.1.2.3.2.5 = Counter64: 0

и пример вывода сценария будет

qos_match_2:431741706 qos_match_3:12464887554 qos_match_4:69827660661 dis_match_2:0 dis_match_3:345524650 dis_match_4:0 

Где каждая строка соответствует классу Qos, а мы используем только классы 2, 3 и 4

OID .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.2 соответствует байтам с согласованным QoS, а OID .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.6 вместо этого соответствует отброшенным байтам QoS.

Как я могу решить эту проблему?

В псевдокоде я хотел бы:

#hwCBQoSIfQueueMatchedBytes
qos_match=$(snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.2)

printf "qos_match2:" $qos_match[0]
printf "qos_match3:" $qos_match[1]
printf "qos_match4:" $qos_match[2]

и так далее


ОБНОВЛЕНИЕ 07.05.2020 после предложения luciole75w:

#!/bin/bash

#set -x

MYCOMMUNITY="mycommunity"

mapfile -t qos_match < <(
    snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.2 |
    awk '2 <= NR && NR <= 4 { print $4 }'
)

mapfile -t dis_match < <(
    snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.6 |
    awk '2 <= NR && NR <= 4 { print $4 }'
)

for n in {2..4}; do
    printf "qos_match_$n:${qos_match[n-2]} "
done
for n in {2..4}; do
    printf "dis_match_$n:${dis_match[n-2]} "
done

printf "\n"

#set +x

1 Ответ

0 голосов
/ 06 мая 2020

Чтобы сохранить выходные строки в переменной массива bash, вы можете использовать mapfile с подстановкой процесса в качестве входных данных. Следующая команда должна работать для вас, учитывая, что я не знаю snmpbulkwalk, поэтому я просто копирую вашу команду как есть.

mapfile -t qos_match < <(
    snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.2 |
    awk '2 <= NR && NR <= 4 { print $4 }'
)

for n in {2..4}; do
    echo qos_match$n: "${qos_match[n-2]}"
done

Если ваша цель на самом деле - это строка вывода (только), а не массивов, вот альтернативная команда для более эффективного получения ожидаемого результата без использования переменных оболочки.

awk '
    2 <= FNR && FNR <= 4 {
        printf "%s_match_%d:%s%s", name, FNR, $4, (++n < 6 ? OFS : ORS)
    }
' name=qos <(
    snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.2
) name=dis <(
    snmpbulkwalk -v 2c -c $MYCOMMUNITY $1 .1.3.6.1.4.1.2011.5.25.32.1.1.5.1.6.1.6
)
...