Loop para snmpwalk no bash

0

Eu tenho um problema na minha saída usando o snmpwalk, então estou tentando neste script:

var='snmpwalk -v2c -c private ${ip} .1.1.1.6'
echo "${hostname}=>${var}"

para ter esta saída:

R1=>Gauge32: 240
R1=>Gauge32: 293
R1=>Gauge32: 255
R1=>Gauge32: 25

mas na verdade eu tenho essa saída:

R1=>Gauge32: 240
Gauge32: 293
Gauge32: 255
Gauge32: 25

então como posso ter a saída que eu preciso no bash

    
por toto 05.05.2015 / 09:53

3 respostas

1

Não está funcionando como você deseja, pois você está imprimindo o nome do host antes de todas as linhas armazenadas na string $var . em vez de fazer o loop e imprimir o nome do host antes de cada linha.

Aqui está uma maneira de percorrê-los usando um pipe e um awk

snmpwalk -v2c -c private ${ip} .1.1.1.6 | awk -vHost="${hostname}" '{print Host"=>"$0}'
    
por 05.05.2015 / 10:00
1

Em vez de armazenar a saída como um todo (com os caracteres de nova linha incorporados) em uma variável escalar , você poderia (eu não disse que você deveria ) armazenar linhas em uma variável de matriz.

Com ksh93 , mksh , bash , zsh em sh emulação:

IFS='
' # split on newline
set -f
var=($(snmpwalk -v2c -c private "$ip" .1.1.1.6))

E, em seguida, use printf como:

printf "$hostname=>%s\n" "${var[@]}"

Isso pressupõe, no entanto, que $hostname não contém caracteres percentuais ou de barra invertida.

rc e zsh facilitam:

  • rc :

    var = (''('
    '){snmpwalk -v2c -c private $ip .1.1.1.6})
    printf %s\n $hostname'=>'^$var
    
  • zsh :

    var=(${(f)"$(snmpwalk -v2c -c private $ip .1.1.1.6)"})
    printf '%s\n' $hostname'=>'$^var
    

(note que todas essas soluções ignoram as linhas vazias)

    
por 05.05.2015 / 11:30
0

Não acho que seja uma boa ideia atribuir toda a saída do comando a uma variável e depois fazer a formatação. Mas se você quiser fazer isso, você pode usar printf para fazer a formatação. A chave é expandir hostname dentro da string de formato, para que somente a lista dos pares tipo-valor em var seja afetada pelos especificadores de formato ( %s e %d neste caso), e printf garante a reutilização dos especificadores de formato para cada par de dados:

var='snmpwalk -v2c -c private ${ip} .1.1.1.6'
printf "${hostname}=>%s %d\n" ${var}

(Nota: Não há citações em torno de ${var} neste caso.)

    
por 05.05.2015 / 13:02