Eu gostaria de obter o número rating
como saída 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?
Respostas:
fonte
awk -F: '$1 == "rating" {print $2}'
awk -F: '/^rating:/ { print $2 }'
?O Quanta me superou, mas incluirei uma
sed
variante se você estiver assim:O mesmo aconteceu com o MadHatter. Sua solução atual é perfeitamente correta. (Embora eu espere
"^rating:"
mais do que apenas a palavra para garantir que você obtenha apenas a linha que deseja).fonte
sed
! É tão subutilizado e subvalorizado ...Você também pode usar o shell:
fonte
nc
. Agradável!sim, você pode (e deve) usar (um) awk em vez de (dois) grep e cut:
Certifique-se de combinar sua linha da melhor maneira possível para evitar erros feios.
/rating/
trabalho,/^rating/
é melhor (mais seguro),/^rating:/
é melhor (neste caso).fonte
Pode:
(Eu não sei o que você está fazendo com o host local acima, usei sua saída como entrada para o meu comando awk e substituí o "cat" por "nc ..." - mas deve ficar bom.)
Mas por que você faria isso? A maneira UNIX é ter muitas ferramentas pequenas, cada uma das quais faz uma coisa bem, unidas por meio de pipelines, em vez de usar ferramentas multifuncionais maiores. Você precisa selecionar uma única linha correspondente e selecionar um campo a partir dela:
grep
seleciona linhas com correspondências ecut
seleciona campos das linhas de entrada; eles são perfeitos para a tarefa. Mas se você realmente quer fazer tudo em um com awk, bem, lá está.fonte
grep
ecut
requer gerar dois processos e usarawk
(oused
) requer apenas um. Gerar um processo é computacionalmente caro. Além disso, ao contrário de useperl
ouruby
(et al),sed
eawk
são muito mais leves na frente.Embora a resposta do quanta seja a mais fácil e a que eu escreveria também, aposto que você não sabia que o GNU awk (gawk) também pode fazer networking ? Você pode escrever a coisa toda com o awk se realmente quiser:
Isso pode ser útil se um servidor não tiver nc instalado, nc tiver permissões restritas ou se você realmente gostar do awk.
fonte
Você também pode usar sed,
nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"
Isso garantirá que a "classificação" inicie a linha e que os dígitos sigam o
rating:
fonte
Se Perl é uma opção:
nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'
-a
a divisão automática de cada linha na@F
matriz-F:
usa:
como separador de campos, em vez do padrão de espaço em branco/rating/
retornar true se o regex encontrado$F[1]
for o segundo elemento da@F
matriz.As matrizes Perl começam com o elemento 0, enquanto o awk começa com $ 1
fonte