Extraindo dados específicos do SNMP

0

Concluí uma pesquisa SNMP para obter licenças diferentes dos meus roteadores. Eu tenho pesquisado com sucesso a informação; Agora quero poder apresentá-lo. Um instantâneo da saída que tenho é:

SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.1.1 = STRING: "ipbasek9"  
SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.1.2 = STRING: "securityk9"  
SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.2.1 = STRING: "securityk9"  
SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.2.2 = STRING: "uck9"

Eu só quero mostrar o que está entre aspas:

  • "ipbasek9"
  • "securityk9"
  • etc.

Eu encontrei o regex para ele "(. *?)", que irá destacar todos os dados nas aspas, mas qual comando vai realmente puxar os dados do texto? Eu tentei todos os tipos de variações do awk, sed, grep, mas ainda não tendo sorte.

    
por Paul Davies 27.03.2018 / 17:43

1 resposta

1

Solução 1

grep tem essa opção incorporada, eu a utilizo às vezes.
De man grep :

       -o, --only-matching
          Print only the matched (non-empty) parts of a matching line, with each  such  part  on  a  separate
          output line.

Em seguida, você pode usar tr para se livrar de caracteres indesejados:

$ tr -d '"'

Cadeia de teste:

$ echo 'SMI::enterprises.9.9.543.1.2.3.1.3.1.1.2 = STRING: "securityk9"' | grep -E -o '"(.*?)"' | tr -d '"'

Saída:

securityk9

Solução 2

Outra maneira, se o número de campos delimitados por espaço for consistente, poderia estar usando cut (e tr , portanto, ainda dois canais e tenho certeza que isso pode ser feito em uma execução):

$ cut -d ' ' -f 4 | tr -d '"'

Teste:

$ echo 'SMI::enterprises.9.9.543.1.2.3.1.3.1.1.2 = STRING: "securityk9"' | cut -d ' ' -f 4 | tr -d '"'
securityk9

Solução 3

O uso de perl deve ser mais universal e portátil entre todos os sistemas Linux e Unix com o Perl 5 instalado. Canalize sua saída para:

perl -p -e 's/.*?"(\w+)"/$1/g' -

Exemplo:

$ echo 'SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.1.1 = STRING: "ipbasek9"' | perl -p -e 's/.*?"(\w+)"/$1/g' -
ipbasek9

Explicação:

-p           iterate over each line of input
-e           execute following code
s/foo/bar/g  substitute 'foo' with 'bar' globally, in entire line
.*?"         match any characters non-greedy, so up to first left-most double quote "
(\w+)        match and capture into $1 any word-characters (alphanumeric, underscore _, plus connector punctuation chars)
$1           substitute with with whatever was captured in first parenthesis 
    
por 27.03.2018 / 17:49