Script Bash processando texto snmp para imprimir somente o ID desejado

1

Eu estou tentando criar um script bash manipulando respostas snmp da mesma maneira, independentemente de o OID estar ou não instalado no cliente.

Os clientes podem receber as seguintes respostas:

SNMPv2-SMI::mib-2.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD          "

iso.3.6.1.2.1.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD          "

Eu quero pegar a última parte, 1062, que é o número do id. O que essas respostas compartilham é 47.1.1.1.1.13. (Id number).

Como posso processar o texto para imprimir apenas o número de identificação, independentemente de como a resposta do cliente parece no começo?

    
por Sebbeleu 14.10.2015 / 10:30

3 respostas

1

Por exemplo, você pode remover tudo, exceto um número, seguindo dígitos e pontos:

sed -e 's/.*[0-9.]*\.\([0-9]*\).*//'

Explicação:

.*         anything
[0-9.]*    digits and dots in any order
\.         dot
\(         start a matching group
  [0-9]*   digits
\)         end the matching group
.*         anything

Toda a string correspondente é substituída pelo grupo correspondente, ou seja, o último número após dígitos e pontos.

    
por 14.10.2015 / 10:37
1

Se a única coisa de que você pode ter certeza é que deseja uma sequência de dígitos que vem depois de 47.1.1.1.1.13. , você pode usar um dos seguintes:

grep -Po '47\.1\.1\.1\.1\.13.\K\d+'
sed -n 's/.*47\.1\.1\.1\.1\.13\.\([0-9]\+\).*//p'
perl -lne '/47\.1\.1\.1\.1\.13\.(\d+)/ && print $1'

Se, como no seu exemplo, a string de destino estiver sempre antes de STRING , você poderá usar:

grep -Po '\d+(?= STRING)' 
sed -n 's/.*\.\([0-9]\+\) STRING.*//p' 
perl -lne '/(\d+)(?= STRING)/ && print $1'

Como alternativa, se a string de destino for sempre a primeira ocorrência de um ponto, uma sequência de números e um espaço, que é o que você mostra na sua pergunta, você pode fazer:

grep -Po '^\S+\.\K\d+' 
sed -n 's/^[^ \t]*\.\([0-9]\+\).*//p'
perl -lne '/^\S+\.(\d+)/ && print $1' file
    
por 14.10.2015 / 10:49
0

Com base em Remova duas substrings de uma string :

$ shopt -s extglob
$ resp1='SNMPv2-SMI::mib-2.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD          "'
$ resp2='iso.3.6.1.2.1.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD          "'
$ echo ${resp1//@(*47.1.1.1.1.13.| STRING*)}
1062
$ echo ${resp2//@(*47.1.1.1.1.13.| STRING*)}
1062
    
por 14.10.2015 / 11:49