Wenn ich also eine Datei mit cat
und dann mit öffne grep
, um übereinstimmende Zeilen zu erhalten, komme ich nur dann weit, wenn ich mit dem bestimmten Protokollsatz arbeite, mit dem ich es zu tun habe. Es ist eine Möglichkeit erforderlich, Linien mit einem Muster abzugleichen, aber nur den Teil der Linie nach dem Abgleich zurückzugeben. Der Anteil vor und nach dem Spiel wird konstant variieren. Ich habe mit sed
oder gespielt awk
, konnte aber nicht herausfinden, wie die Linie gefiltert werden kann, um entweder den Teil vor dem Spiel zu löschen oder den Teil nach dem Spiel zurückzugeben. Dies ist ein Beispiel für eine Zeile, die ich filtern muss:
2011-11-07T05:37:43-08:00 <0.4> isi-udb5-ash4-1(id1) /boot/kernel.amd64/kernel: [gmp_info.c:1758](pid 40370="kt: gmp-drive-updat")(tid=100872) new group: <15,1773>: { 1:0-25,27-34,37-38, 2:0-33,35-36, 3:0-35, 4:0-9,11-14,16-32,34-38, 5:0-35, 6:0-15,17-36, 7:0-16,18-36, 8:0-14,16-32,34-36, 9:0-10,12-36, 10-11:0-35, 12:0-5,7-30,32-35, 13-19:0-35, 20:0,2-35, down: 8:15, soft_failed: 1:27, 8:15, stalled: 12:6,31, 20:1 }
Die Portion, die ich brauche, ist alles nach "ins Stocken geraten".
Der Hintergrund dahinter ist, dass ich herausfinden kann, wie oft etwas stehen bleibt:
cat messages | grep stalled | wc -l
Was ich tun muss, ist herauszufinden, wie oft ein bestimmter Knoten angehalten hat (angezeigt durch den Teil vor jedem Doppelpunkt nach "angehalten") Keine Blockierungen, was mir nicht hilft. Ich muss nur den blockierten Teil filtern, damit ich dann nach einem bestimmten Knoten aus denen suchen kann, die blockiert haben.
In jeder Hinsicht ist dies ein freebsd-System mit Standard-GNU-Kern-Utils, aber ich kann keine zusätzlichen Hilfsprogramme installieren.
quelle
sed
Lösung und behandeln Sie Whitespace nicht speziell.Antworten:
Das kanonische Werkzeug dafür wäre
sed
.Ausführliche Erklärung:
-n
bedeutet, dass standardmäßig nichts gedruckt wird.-e
wird von einem sed Befehl gefolgt.s
ist der Befehl zum Ersetzen von Mustern.^.*stalled:
entspricht dem von Ihnen gesuchten Muster sowie einem beliebigen vorhergehenden Text (.*
dh einem beliebigen Text, mit einer Initiale^
, die besagt, dass die Übereinstimmung am Anfang der Zeile beginnt). Beachten Sie, dass beistalled:
mehrmaligem Auftreten in der Zeile das letzte Vorkommen berücksichtigt wird.stalled:
, wird durch die leere Zeichenfolge ersetzt (dh gelöscht).p
Mittel zum Drucken der transformierten Zeile.Wenn Sie den übereinstimmenden Teil beibehalten möchten, verwenden Sie eine Rückreferenz:
\1
Im Ersatzteil wird angegeben, was sich innerhalb einer Gruppe\(…\)
im Muster befindet. Hier könnte manstalled:
nochmal in das Ersatzteil schreiben ; Diese Funktion ist nützlich, wenn das gesuchte Muster allgemeiner ist als eine einfache Zeichenfolge.Manchmal möchten Sie den Teil der Linie nach dem Spiel entfernen. Sie können es in die Übereinstimmung einbeziehen, indem Sie
.*$
am Ende des Musters einen beliebigen Text.*
gefolgt vom Ende der Zeile$
einfügen. Wenn Sie diesen Teil nicht in eine Gruppe einfügen, auf die Sie im Ersetzungstext verweisen, wird das Zeilenende nicht in der Ausgabe angezeigt.Zur weiteren Veranschaulichung von Gruppen und Rückverweisen wird mit diesem Befehl der Teil vor dem Spiel und der Teil nach dem Spiel vertauscht.
quelle
sed … <messages
, da Sie Daten aus einer Datei verarbeiten möchten. Zu handeln , auf Daten von einem anderen Befehl erzeugen, dann würden Sie ein Rohr benutzensomecommand | sed …
.sed 's/^.*stalled//'
da-r
auf Linux - spezifisch ist und funktioniert nicht auf anderen Systemen wie macOS und hier sind Sie keinen Nutzen daraus zu bekommen.Das andere kanonische Tool, das Sie bereits verwenden
grep
:Zum Beispiel:
Hat das gleiche Ergebnis wie die zweite Option von Gilles:
Das
-o
Flag gibt den--only-matching
Teil des Ausdrucks zurück, also nicht die gesamte Zeile, die normalerweise von grep ausgeführt wird.Um das "ins Stocken geratene:" aus der Ausgabe zu entfernen, können wir ein drittes kanonisches Werkzeug verwenden:
Der
cut
Befehl verwendet Trennzeichen:
und druckt Feld 2 bis zum Ende. Das ist natürlich eine Frage der Präferenz, aber diecut
Syntax ist mir sehr leicht zu merken.quelle
-o
Option! Ich wollte darauf hinweisen, dassgrep
das nicht\n
als Zeilenvorschub erkannt wird, daher stimmt Ihr erstes Beispiel nur mit dem erstenn
Zeichen überein . Gibt beispielsweiseecho "Hello Anne" | grep -o 'A[^\n]*'
die Zeichenfolge zurückA
. Gibt jedochecho "Hello Anne" | grep -o 'A.*'
das erwartete zurückAnne
, da es.
mit jedem Zeichen außer der Newline übereinstimmt.cut
Trennzeichen-d':'
von @poige entfernt werden. Ich finde es einfacher, mich an Zitate zu erinnern, z . B. an-d' '
oder-d';'
.-f 2
zu verwenden. Ernsthaft, warum nicht?;
anstatt eines Doppelpunkts:
anders interpretiert wird, wenn es nicht in Anführungszeichen gesetzt wird. Natürlich ist das logisches Verhalten, aber ich verlasse mich trotzdem gerne auf das Muskelgedächtnis. Ich mag es nicht, das Trennzeichen einmal, aber nicht das andere Mal zu zitieren. Nur persönliche Vorlieben, wie ich schon sagte: leichter zu merken..*
ist, wird benötigt, hat für mich gut funktioniert:cat filename | grep 'Return only this line xyz text' | grep -o 'xyz.*'
Returnsxyz text
Früher habe ich
ifconfig | grep eth0 | cut -f3- -d:
dies nehmenund lassen Sie es so aussehen
quelle
cat /sys/class/net/*/address
, kein Parsing erforderlich.Ein weiteres kanonisches Tool, das Sie in Betracht gezogen haben,
awk
könnte mit der folgenden Zeile verwendet werden:Ausführliche Erklärung:
-F
definiert ein Trennzeichen für die Zeile, dh "ins Stocken geraten". Alles vor dem Trennzeichen wird mit angesprochen$1
und alles nach mit$2
./reg-ex/
Sucht nach dem passenden regulären Ausdruck, in diesem Fall "ins Stocken geraten".{print $<n>}
- druckt eine Spalte. Da Ihr Trennzeichen als blockiert definiert ist, wird alles nach dem Blockieren als zweite Spalte betrachtet.quelle