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