$ nc localhost 9571 | awk -F: '/rating/ { print $2 }'
Gostaria de obter o número de rating
como resultado deste
# nc localhost 9571
language:
language:en_ZA.UTF-8
language:en_ZW.UTF-8
session-with-name:Ubuntu Classic (No effects):gnome-session --session=2d-gnome
session-with-name:Ubuntu (Safe Mode):gnome-session -f --session=2d-gnome
session-with-name:Ubuntu Classic:gnome-session --session=classic-gnome
xsession:/etc/X11/Xsession
rating:94
Eu posso fazer assim
# nc localhost 9571 | grep rating | cut -d: -f2
94
mas poderia awk
ser usado para uma solução mais simples?
O Quanta me bateu nisso, mas incluirei uma sed
variante se você estiver assim:
nc localhost 9571 | sed -ne 's/^rating://p'
Idem o que MadHatter disse, no entanto. Sua solução atual é perfeitamente sólida. (Embora eu tenha chamado "^rating:"
ao invés de apenas a palavra para garantir que você só obtenha a linha que deseja.)
Você também pode usar o shell:
nc localhost 9571 |
while IFS=: read key val; do [[ $key = "rating" ]] && echo "$val"; done
sim, você pode (e deve) usar (um) awk ao invés de (dois) grep e cut:
$ nc localhost 9571 | awk -F: '/^rating:/ { print $2 }'
Certifique-se de combinar sua linha o melhor que puder para evitar erros feios.
/rating/
funciona, /^rating/
é melhor (mais seguro), /^rating:/
é melhor (neste caso). Pode:
nc localhost 9571 | awk -F: '{ if ($1 == "rating") print $2 }'
(Eu não sei o que você está fazendo com o localhost acima, então usei sua saída como entrada para o meu comando awk, então substituí o "cat" por "nc ..." - mas deve ficar bem.)
Mas por que você faria isso? A maneira UNIX é ter muitas ferramentas pequenas, cada uma das quais faz uma coisa bem, conectada via pipelines, em vez de usar ferramentas multifuncionais. Você precisa selecionar uma única linha correspondente, e selecionar um campo a partir dela: grep
seleciona linhas com correspondências e cut
seleciona campos de linhas de entrada; eles são perfeitos para a tarefa. Mas se você realmente quer fazer tudo com o awk, bem, lá vai você.
Embora a resposta do quanta seja a mais fácil e a que eu escreveria também, aposto que você não sabia
BEGIN {
FS = ":"
f = "/inet/tcp/0/127.0.0.1/9571"
while ((f |& getline) > 0)
if ($1 ~ /^rating$/) {print $2}
}
Isso pode ser útil se um servidor não tiver o nc instalado, nc tiver permissões restritas ou se você realmente gostar do awk.
Você também pode usar sed,
nc localhost 9571 | sed -n "s/^rating:\([\d]*\)//p"
Isso garantirá que a "avaliação" inicie a linha e que os dígitos sigam o rating:
Se o Perl é uma opção:
nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'
-a
autosplits cada linha na matriz @F
-F:
usa :
como o separador de campos, em vez do padrão de espaços em branco
/rating/
retorna verdadeiro se a regex for encontrada < br> $F[1]
é o segundo elemento da matriz @F
.
Matrizes Perl começam com o elemento 0, enquanto o awk começa com $ 1