Je voudrais obtenir le numéro rating
de cette sortie
# 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
Je peux le faire comme ça
# nc localhost 9571 | grep rating | cut -d: -f2
94
mais pourrait awk
être utilisé à la place pour une solution plus simple?
Réponses:
la source
awk -F: '$1 == "rating" {print $2}'
awk -F: '/^rating:/ { print $2 }'
- être ?Quanta m'a battu, mais je vais inclure une
sed
variante si vous êtes enclin à cela:Idem cependant ce que MadHatter a dit. Votre solution actuelle est parfaitement solide. (Bien que je préfère
"^rating:"
le mot plutôt que le mot pour vous assurer d'obtenir uniquement la ligne souhaitée.)la source
sed
! Il est tellement sous-utilisé et sous-estimé ...Vous pouvez également simplement utiliser le shell:
la source
nc
. Agréable!oui, vous pouvez (et devriez) utiliser (un) awk au lieu de (deux) grep et cut:
Assurez-vous de faire correspondre votre ligne aussi bien que possible pour éviter les bugs laids.
/rating/
travaux,/^rating/
c'est mieux (plus sûr),/^rating:/
est le meilleur (dans ce cas).la source
Ça peut:
(Je ne sais pas ce que vous faites avec localhost ci-dessus, alors utilisez votre sortie comme entrée pour ma commande awk, puis remplacez le "cat" par "nc ..." - mais ça devrait aller.)
Mais pourquoi feriez-vous cela? La méthode UNIX consiste à disposer de nombreux petits outils, chacun faisant bien une chose, assemblés via des pipelines, plutôt que d'utiliser des outils multifonctions plus grands. Vous devez sélectionner une seule ligne correspondante, le champ de sélection de celui-ci:
grep
sélectionne les lignes avec des correspondances, etcut
sélectionne les champs des lignes d'entrée; ils sont parfaits pour la tâche. Mais si vous voulez vraiment tout faire en un avec awk, eh bien, c'est parti.la source
grep
etcut
nécessite la génération de deux processus, et l'utilisationawk
(oused
) n'en requiert qu'un. La création d'un processus coûte cher en calcul. En outre, contrairement à l' utilisationperl
ouruby
(et al),sed
etawk
sont beaucoup plus léger avant vers le haut.Bien que la réponse de quanta soit la plus simple et celle que j'écrirais aussi, je parie que vous ne saviez pas que GNU awk (gawk) peut aussi faire du réseautage ? Vous pouvez écrire le tout avec awk si vous voulez vraiment:
Cela peut être utile si un serveur n'a pas installé nc, nc a des perms restreints ou si vous aimez vraiment awk.
la source
Vous pouvez également utiliser sed,
nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"
Cela permettra de s'assurer que "note" commence la ligne, et que les chiffres suivent le
rating:
la source
Si Perl est une option:
nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'
-a
fractionne automatiquement chaque ligne dans le@F
tableau-F:
utilise:
comme séparateur de champ, au lieu de la valeur par défaut des espaces,/rating/
renvoie true si l'expression régulière est trouvée$F[1]
est le 2e élément du@F
tableau.Les tableaux Perl commencent par l'élément 0, tandis que awk commence par $ 1
la source