grep -A1 'blah' logfile
Dank dieses Befehls für jede Zeile, in der 'blah' enthalten ist, erhalte ich die Ausgabe der Zeile, die 'blah' enthält, und die nächste Zeile, die in der Protokolldatei folgt. Es mag einfach sein, aber ich kann keinen Weg finden, die Zeile mit 'blah' wegzulassen und nur die nächste Zeile in der Ausgabe anzuzeigen.
-A1
Option zu suchencurl whatismyip.org | grep -A1 'Your IP Address'
-A1
. Vielen Dank!Antworten:
du kannst es mit awk versuchen:
quelle
awk '/blah/{getline; getline; print}' logfile
wenn du bei grep bleiben willst:
oder
quelle
Piping ist dein Freund ...
Verwenden Sie
grep -A1
diese Option , um die nächste Zeile nach einem Match anzuzeigen, und leiten Sie das Ergebnis an einetail
Zeile weiter.quelle
Tolle Antwort von raim, war sehr nützlich für mich. Es ist trivial, dies zu erweitern, um z. B. Zeile 7 nach dem Muster zu drucken
quelle
Wenn diese nächsten Zeilen niemals 'bla' enthalten, können Sie sie filtern mit:
Die Verwendung von
cat logfile | ...
ist nicht erforderlich.quelle
Im Allgemeinen stimme ich zu, dass Sie hier viel Grep verlangen und dass ein anderes Tool die bessere Lösung sein könnte. Aber in einer eingebetteten Umgebung möchte ich dies möglicherweise nicht haben
sed
oderawk
nur tun. Ich habe festgestellt, dass die folgende Lösung funktioniert (solange es sich nicht um zusammenhängende Übereinstimmungen handelt):Passen Sie sie grundsätzlich an, indem Sie für jede Übereinstimmung 1 Kontextzeile anhängen und diese dann durch eine inverse Übereinstimmung Ihres ursprünglichen Musters leiten, um diese zu entfernen. Dies bedeutet natürlich, dass Sie davon ausgehen können, dass Ihr Muster nicht in der "nächsten" Zeile angezeigt wird.
quelle
Bisher wurden viele gute Antworten auf diese Frage gegeben, aber ich vermisse immer noch eine, die ich
awk
nicht benutzegetline
. Da es im Allgemeinen nicht notwendig ist, zu verwendengetline
, würde ich mich für Folgendes entscheiden:oder
Die Logik besteht immer darin, die Zeile zu speichern, in der "bla" gefunden wird, und dann die Zeilen zu drucken, die eine Zeile später sind.
Prüfung
Beispieldatei:
Holen Sie sich alle Zeilen nach "bla". Dies druckt ein weiteres "bla", wenn es nach dem ersten erscheint.
Holen Sie sich alle Zeilen nach "bla", wenn sie selbst nicht "bla" enthalten.
quelle
Ich kenne keine Möglichkeit, dies mit grep zu tun, aber es ist möglich, awk zu verwenden, um das gleiche Ergebnis zu erzielen:
quelle
Perl Einzeiler Alarm
Nur zum Spaß ... drucke nur eine Zeile nach dem Spiel
Noch mehr Spaß ... drucken Sie die nächsten zehn Zeilen nach dem Spiel
ein bisschen schummeln, da es tatsächlich zwei Befehle gibt
quelle
$. == $next && print
ist das gleiche wieprint if $. == $next
grep -A1
). Wenn Sie nur die nächsten Zeilen drucken möchten, aber niemals eine Zeile mit einer Übereinstimmung, behalten Sie diese Reihenfolge bei. (Ich beachte nur, wie $ next für aufeinanderfolgende Spiele überfallen würde)Es sieht so aus, als würden Sie dort das falsche Werkzeug verwenden. Grep ist nicht so raffiniert, ich denke, Sie möchten awk als Werkzeug für den Job einsetzen:
awk '/blah/ { getline; print $0 }' logfile
Wenn Sie irgendwelche Probleme haben, lassen Sie es mich wissen, ich denke, es lohnt sich, ein bisschen awk zu lernen, es ist ein großartiges Werkzeug :)
ps Dieses Beispiel gewinnt keinen "nutzlosen Gebrauch des Katzenpreises";) http://porkmail.org/era/unix/award.html
quelle
grep / Pattern / | Schwanz -n 2 | Kopf -n 1
Tail first 2 und dann last last, um nach dem Match genau die erste Zeile zu erhalten.
quelle