GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Nur den Teil einer Linie nach einem übereinstimmenden Muster zurückgeben?

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, wenn stalled: 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.

Verwandte:Sed:Nur das erste Auftreten einer Musterübereinstimmung drucken?

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'

Linux
  1. Übereinstimmende Zeile und N-te Zeile von der Übereinstimmenden Zeile drucken?

  2. Wie stoppe ich den Find-Befehl nach dem ersten Match?

  3. Vorherige Zeile nach einer Musterübereinstimmung mit Sed drucken?

  4. Einfügen einer Datei in eine andere Datei nach dem ersten Auftreten eines Musters?

  5. Nur die erste Zeile aus jeder Folge aufeinanderfolgender Zeilen beibehalten, die einem Muster entsprechen?

Was ist diese Summe in der allerersten Zeile nach ls -l?

sed zum Einfügen nur bei der ersten Übereinstimmung

Das Konzept von 'Hold space' und 'Pattern space' in sed

sed - Zeile nach X Zeilen nach Übereinstimmung einfügen

Wie kann man nur die erste Zeile von zwei Dateien unterscheiden?

Befehlszeile, um nach Strg-Alt-F1 zur GUI zurückzukehren?