it-swarm.com.de

Verwendung von grep für 2 verschiedene Zeilen

Wie kann ich mit einem einzigen grep -Befehl nach zwei verschiedenen Phrasen suchen, die sich in zwei verschiedenen Zeilen befinden?

Zum Beispiel

Zeile 1: Dies ist eine süße.

Zeile 2: Zitrone.

Ich habe dies aber ohne Ergebnis genutzt

grep "sweet.*lemon" file_type
13

Um grep für zwei verschiedene Zeilen zu verwenden, suchen Sie nach beiden Mustern

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

Oder benutze alternation

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

Um die nächste Zeile nach einem Muster zu erhalten, können Sie die Kontextoption verwenden

$ grep -A1 sweet file_type
This is a sweet
lemon.

Aber wenn Sie explizit nach einem mehrzeiligen Muster suchen, das ist schwierig, weil grep in Zeilen denkt ... . Dein .* fängt alles zwischen "süß" und "Zitrone" in der Zeile . Wir können "lemon" in der nächsten Zeile mit -P erhalten, indem wir \n verwenden, um die neue Zeile abzugleichen, und indem wir grep sagen, wird die Datei mit -z durch Null getrennt:

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

Anmerkungen:

  • -E Verwenden Sie erweiterte reguläre Ausdrücke (um das Zeichen | zu verwenden, ohne es zu entkommen)
  • -An Zusätzliche Zeilen nach dem Muster drucken, wobei n die Anzahl der zu druckenden nachfolgenden Zeilen ist
  • -P Verwenden Sie reguläre Ausdrücke im Perl-Stil ("experimentell" in grep - installieren Sie pcregrep stattdessen für eine bessere Unterstützung von Perl-Regex)
  • -z Verwenden Sie das Nullzeichen als Trennzeichen (tun Sie in diesem Fall nur so, aber grep wird unser Wort dafür nehmen)
  • -o druckt nur das passende Teil
19
Zanna

So was:

grep "sweet\|lemon"
5
madneon