Script Bash para analisar a saída SNMP

0

Estou trabalhando no monitoramento de um dispositivo Cisco no qual eu precisaria analisar a saída snmp e imprimi-la em linhas separadas mais detalhadas.

Por meio da linha de comando, posso fazer isso:

snmpwalk -m /usr/share/snmp/mibs/CISCO-UNIFIED-COMPUTING-STORAGE-MIB.my -v2c -c opennms-Priv X.X.X.X .1.3.6.1.4.1.9.9.719.1.45.4.1.18 2>/dev/null | awk '{print $4}' | while read -r line ; do echo "Drive $line" ;  done

Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)
Drive online(1)

No entanto, quando eu uso o mesmo em um script:

#!/bin/bash
Output='snmpwalk -m /usr/share/snmp/mibs/CISCO-UNIFIED-COMPUTING-STORAGE-MIB.my -v2c -c opennms-Priv 10.201.1.131 .1.3.6.1.4.1.9.9.719.1.45.4.1.18 2>/dev/null | awk '{print $4}''

while read -r line ; do
        echo "Drive $line";

done << $Output

Eu entendo isso,

bash -x CIMC-Monitong.sh
++ snmpwalk -m /usr/share/snmp/mibs/CISCO-UNIFIED-COMPUTING-STORAGE-MIB.my -v2c -c opennms-Priv X.X.X.X .1.3.6.1.4.1.9.9.719.1.45.4.1.18
++ awk '{print $4}'
+ Output='online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)
online(1)'
CIMC-Monitong.sh: line 9: warning: here-document at line 7 delimited by end-of-file (wanted '$Output')
+ read -r line
+ echo 'Drive '
Drive
+ read -r line
+ echo 'Drive '
Drive
+ read -r line

O que estou perdendo?

Edit: A razão pela qual eu não canalizei é, agora estou recebendo uma saída semelhante a esta:

Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1) Drive online(1)

Mas eu espero algo assim:

Drive1 online(1) Drive2 online(1) Drive3 online(1) Drive4 online(1) Drive5 online(1) Drive6 online(1) Drive7 online(1) Drive8 online(1) Drive9 online(1) Drive10 online(1) Drive11 online(1) Drive12 online(1) Drive13 online(1) Drive14 online(1) Drive15 online(1) Drive16 online(1)

    
por pradeep s 27.01.2017 / 19:32

1 resposta

1

O <<$Output no script é interpretado como o início de um documento aqui.

Geralmente um documento aqui é escrito como, por exemplo,

cat <<END_OF_INPUT
.
.
.
.
END_OF_INPUT

... mas é totalmente legal usar $Output ou qualquer outra string como delimitador de documento aqui.

Você provavelmente pretendia usar <$Output , mas isso também estaria errado, pois isso seria uma tentativa de ler o arquivo $Output , que não é um nome de arquivo, mas a saída do seu pipeline. / p>

Tente colocar a saída no loop while, como você fez na linha de comando:

#!/bin/bash

snmpwalk -m /usr/share/snmp/mibs/CISCO-UNIFIED-COMPUTING-STORAGE-MIB.my \
  -v2c -c opennms-Priv X.X.X.X .1.3.6.1.4.1.9.9.719.1.45.4.1.18 2>/dev/null |
awk '{print $4}' |
while read -r line; do 
  echo "Drive $line"
done

Eu costumo usar printf em vez de echo quando a saída precisa conter dados fornecidos pelo usuário (quaisquer dados vindos de fora do script, na verdade):

printf 'Drive %s\n' "$line"

Veja " Por que o printf é melhor que o eco? "

Atualizado:

Se sua saída precisa parecer

Drive1 online(1)
Drive2 online(1)
... etc.

com o número após Drive sendo estritamente incrementado em um para cada linha, então você precisa de um contador no loop:

while read -r line; do 
  printf 'Drive%d %s\n' "$(( ++count ))" "$line"
done
    
por 27.01.2017 / 19:38