Also eine Datei mit cat
öffnen und dann mit grep
passende Zeilen zu bekommen, bringt mich nur so weit, wenn ich mit dem bestimmten Protokollsatz arbeite, mit dem ich es zu tun habe. Es braucht eine Möglichkeit, Linien mit einem Muster abzugleichen, aber nur den Teil der Linie nach der Übereinstimmung zurückzugeben. Der Teil vor und nach dem Spiel wird durchgängig variieren. Ich habe mit sed
gespielt oder awk
, konnte aber nicht herausfinden, wie man die Zeile filtert, um entweder den Teil vor dem Match zu löschen oder den Teil nach dem Match zurückzugeben, beides wird funktionieren.
Dies ist ein Beispiel für eine Zeile, die ich brauche zu filtern:
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“.
Hintergrund ist, dass ich herausfinden kann, wie oft etwas ins Stocken gerät:
cat messages | grep stalled | wc -l
Was ich tun muss, ist herauszufinden, wie oft ein bestimmter Knoten ins Stocken geraten ist (angezeigt durch den Abschnitt vor jedem Doppelpunkt nach „stalled“. Wenn ich nur danach greife (z. B. 20:), kann es Zeilen mit Soft Fails zurückgeben, aber keine Verzögerungen, was mir nicht weiterhilft. Ich muss nur den blockierten Teil filtern, damit ich dann nach einem bestimmten Knoten aus denen suchen kann, die blockiert sind.
In jeder Hinsicht ist dies ein Freebsd-System mit standardmäßigen GNU-Kerndienstprogrammen, aber ich kann nichts Extras zur Unterstützung installieren.
Akzeptierte Antwort:
Das kanonische Werkzeug dafür wäre sed
.
sed -n -e 's/^.*stalled: //p'
Ausführliche Erklärung:
-n
bedeutet standardmäßig nichts zu drucken.-e
gefolgt von einem sed-Befehl.s
ist der Musterersetzungsbefehl.- Der reguläre Ausdruck
^.*stalled:
dem gesuchten Muster entspricht, plus vorangestelltem Text (.*
also beliebiger Text, mit einem^
am Anfang zu sagen, dass das Spiel am Anfang der Zeile beginnt). Beachten Sie Folgendes, wennstalled:
mehrmals in der Zeile vorkommt, stimmt dies mit dem letzten Vorkommen überein. - Die Übereinstimmung, d. h. alles in der Reihe bis
stalled:
, wird durch den leeren String ersetzt (also gelöscht). - Das letzte
p
bedeutet, die transformierte Zeile zu drucken.
Wenn Sie den übereinstimmenden Teil beibehalten möchten, verwenden Sie eine Rückwärtsreferenz:1
im Ersatzteil bezeichnet den Inhalt einer Gruppe (…)
im Muster. Hier könnten Sie stalled:
schreiben wieder im Ersatzteil; Diese Funktion ist nützlich, wenn das gesuchte Muster allgemeiner ist als eine einfache Zeichenfolge.
sed -n -e 's/^.*(stalled: )/1/p'
Manchmal möchten Sie den Teil der Linie nach dem Spiel entfernen. Sie können es in die Übereinstimmung einbeziehen, indem Sie .*$
einfügen am Ende des Musters (beliebiger Text .*
gefolgt vom Zeilenende $
). Wenn Sie diesen Teil nicht in eine Gruppe einfügen, auf die Sie im Ersetzungstext verweisen, wird das Ende der Zeile nicht ausgegeben.
Als weitere Veranschaulichung von Gruppen und Rückverweisen vertauscht dieser Befehl den Teil vor dem Match und den Teil nach dem Match.
sed -n -e 's/^(.*)(stalled: )(.*)$/321/p'