Wie man grep für 2 verschiedene Zeilen benutzt


15

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

Beispielsweise

Zeile 1: Dies ist eine süße.

Zeile 2: Zitrone.

Ich habe dies aber ohne Ergebnis genutzt

grep "sweet.*lemon" file_type

Antworten:


20

Um grepzwei 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 für ein mehrzeiliges Muster suchen, die heikel , weil sind grepdenkt in Linien ... . Sie .*werden alles zwischen "süß" und "Zitrone" auf der Linie fangen . Wir können "lemon" in der nächsten Zeile erhalten, -Pindem wir verwenden, um \ndie neue Zeile abzugleichen, und indem wir sagen, dass grepdie Datei durch Folgendes getrennt ist -z:

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

Anmerkungen:

  • -EVerwenden Sie erweiterte reguläre Ausdrücke (um |Zeichen für die Abwechslung zu verwenden, ohne sie zu maskieren).
  • -An Drucken Sie zusätzliche Zeilen nach dem Muster, wobei n die Anzahl der zu druckenden nachfolgenden Zeilen ist
  • -PVerwenden Sie reguläre Ausdrücke im Perl-Stil ("experimentell" in grep- pcregrepstattdessen installieren für bessere Unterstützung von Perl-Regex)
  • -zVerwenden Sie das Nullzeichen als Trennzeichen (tun Sie in diesem Fall nur so, als ob Sie es getan hätten, aber grepnehmen Sie unser Wort dafür)
  • -o Nur das passende Teil ausdrucken

Während der grep -zPBefehl in diesem speziellen Fall funktionieren würde (eine Datei, die aus genau zwei Zeilen besteht), würde er im Allgemeinen jede gewöhnliche durch neue Zeilen getrennte Datei als eine einzelne Zeile betrachten, also entweder den gesamten Dateiinhalt sichern (falls irgendwo eine Übereinstimmung vorliegt) oder nichts; normalerweise wird das nicht verwendet grep.
Marc van Leeuwen

Ja, das ist nur nützlich mit -o... bearbeitet ...
Zanna

Falls dies in anderen Distributionen versucht wird, können Sie auf Folgendes stoßen: grep: The -P and -z options cannot be combined- zB grep (GNU grep) 2.5.1 auf RHEL
Jason Pyeron

6

So was:

grep "sweet\|lemon"

Entschuldigung, aber das wird genau "sweet | lemon"
α --sнιη

4
@ KasiyA Diese Zeile funktioniert gut. grepStandardmäßig arbeitet in „Standard - Modus“, in dem „Sonderzeichen“ wie |, +, *interpretiert buchstäblich es sei denn , sie mit einem Backslash maskiert sind. Siehe zum Beispiel diese Antwort . Um die Art und Weise zu verwenden, wie Sie es wahrscheinlich gewohnt sind, dass "Sonderzeichen" maskiert werden müssen, um wörtlich interpretiert zu werden, müssen Sie in den "erweiterten Modus" ( grep -E) wechseln . Vielleicht könnte Madneon seine Antworten etwas genauer erläutern, zum Beispiel was die OPs versucht hätten ?
Henning Kockerbeck
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.