O awk pode ser usado em seu lugar?

17

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?

    
por Sandra 03.10.2011 / 12:29

8 respostas

32
$ nc localhost 9571 | awk -F: '/rating/ { print $2 }'
    
por 03.10.2011 / 12:37
14

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.)

    
por 03.10.2011 / 12:47
9

Você também pode usar o shell:

nc localhost 9571 | 
while IFS=: read key val; do [[ $key = "rating" ]] && echo "$val"; done
    
por 03.10.2011 / 15:06
7

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).
por 03.10.2011 / 15:49
4

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ê.

    
por 03.10.2011 / 12:33
3

Embora a resposta do quanta seja a mais fácil e a que eu escreveria também, aposto que você não sabia GNU awk (gawk) pode fazer rede também ? Você pode escrever a coisa toda com o awk se você realmente quiser:

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.

    
por 05.10.2011 / 03:17
0

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:

    
por 22.05.2012 / 12:20
0

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

    
por 10.11.2015 / 21:35