Ich möchte die Nummer rating
als Ausgabe von diesem bekommen
# 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
Ich kann es so machen
# nc localhost 9571 | grep rating | cut -d: -f2
94
könnte awk
aber stattdessen für eine einfachere lösung verwendet werden?
Antworten:
quelle
awk -F: '$1 == "rating" {print $2}'
awk -F: '/^rating:/ { print $2 }'
?Quanta hat mich geschlagen, aber ich werde eine
sed
Variante hinzufügen, wenn Sie so geneigt sind:Das Gleiche wie MadHatter. Ihre aktuelle Lösung ist einwandfrei. (Obwohl ich
"^rating:"
eher nach als nur nach dem Wort greifen würde, um sicherzustellen, dass Sie nur die Zeile erhalten, die Sie möchten.)quelle
sed
! Es ist so nicht ausgelastet und unterschätzt ...Sie können auch einfach die Shell verwenden:
quelle
nc
. Nett!Ja, Sie können (und sollten) (eine) awk anstelle von (zwei) grep und cut verwenden:
Achten Sie darauf, dass Sie Ihre Linie so gut wie möglich zusammenbringen, um hässliche Fehler zu vermeiden.
/rating/
arbeitet,/^rating/
ist besser (sicherer),/^rating:/
ist am besten (in diesem Fall).quelle
Es kann:
(Ich weiß nicht, was Sie mit localhost oben machen. Verwenden Sie also Ihre Ausgabe als Eingabe für meinen awk-Befehl und ersetzen Sie dann die "cat" durch "nc ..." - aber es sollte in Ordnung sein.)
Aber warum würdest du das tun? Die UNIX-Methode besteht darin, viele kleine Werkzeuge zu haben, von denen jedes eine Sache gut macht und die über Pipelines aneinandergereiht sind, anstatt größere Multifunktionswerkzeuge zu verwenden. Sie müssen eine einzelne übereinstimmende Zeile auswählen und ein Feld daraus auswählen:
grep
Wählt Zeilen mit Übereinstimmungen aus undcut
wählt Felder aus Eingabezeilen aus; Sie sind perfekt für die Aufgabe. Aber wenn Sie wirklich alles in einem mit awk machen wollen, dann können Sie loslegen.quelle
grep
und dascut
Starten von zwei Prozessen und für die Verwendung vonawk
(odersed
) nur einer erforderlich ist. Das Starten eines Prozesses ist rechenintensiv. Auch im Gegensatz zuperl
oderruby
(et al),sed
undawk
sind viel leichter vorne.Obwohl die Antwort von Quanta die einfachste ist und die, die ich auch schreiben würde, wette ich, dass Sie nicht wussten, dass GNU awk (gawk) auch Networking kann ? Sie können das Ganze mit awk schreiben, wenn Sie wirklich wollen:
Dies kann nützlich sein, wenn auf einem Server nc nicht installiert ist, nc eingeschränkte Zugriffsrechte hat oder wenn Sie awk einfach wirklich mögen.
quelle
Sie können auch sed verwenden,
nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"
Dadurch wird sichergestellt, dass die Zeile mit "Bewertung" beginnt und die Ziffern dem folgen
rating:
quelle
Wenn Perl eine Option ist:
nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'
-a
Das automatische Aufteilen jeder Zeile in das@F
Array-F:
wird:
als Feldtrennzeichen verwendet. Statt des Standardwerts für Whitespace wird/rating/
true zurückgegeben, wenn Regex als zweites$F[1]
Element des@F
Arrays gefunden wird.Perl-Arrays beginnen mit Element 0, während awk mit $ 1 beginnt
quelle