HOWTO · Linux

Verwenden von Grep mit mehreren Zeichenketten

Dieser Artikel zeigt, wie Sie mit grep Zeilen finden, die eines oder mehrere Muster enthalten.

Auf dieser Seite

Für eine kurze Liste wörtlicher Zeichenfolgen verwenden Sie grep -F mit einer eigenen -e-Option für jedes Muster. Wenn die durch Zeilenumbrüche getrennte Liste in einer Datei steht, verwenden Sie grep -F -f patterns.txt. In beiden Fällen gibt grep eine Zeile aus, wenn sie einem beliebigen der angegebenen Muster entspricht. Mit diesen Befehlen können Sie eine Datei durchsuchen oder Text, den ein anderes Programm über die Standardeingabe sendet.

Beide Bash-Beispiele unten wurden ausgeführt: Das erste gibt die Warnungs- und Fehlermeldungen aus der Datei aus, das zweite die passende Fehlermeldung aus der Standardeingabe.

Mit grep einfache Phrasen finden

Standardmäßig sucht grep nach Teilzeichenfolgen. Das Muster word findet daher auch eine längere Zeichenfolge wie sword. Das folgende eigenständige Bash-Beispiel erstellt eine kleine Protokolldatei und sucht darin nach einer von zwei wörtlichen Phrasen. -F sorgt dafür, dass Satzzeichen in einem Muster wörtlich behandelt werden. Mehrere -e-Optionen halten die Muster getrennt und gut lesbar.

work_dir=$(mktemp -d)
trap 'rm -rf "$work_dir"' EXIT
printf '%s\n' 'INFO service ready' 'WARN disk almost full' 'ERROR request failed' > "$work_dir/app.log"
grep -F -e 'WARN disk' -e 'ERROR request' "$work_dir/app.log"
WARN disk almost full
ERROR request failed

Wenn Sie statt einer Datei die Ausgabe eines Befehls durchsuchen möchten, leiten Sie den Text mit einer Pipe an grep weiter. Dieses Beispiel übergibt der Suche zwei Zeilen direkt und benötigt daher keine separate Eingabedatei:

printf '%s\n' 'INFO service ready' 'ERROR request failed' | grep -F -e 'ERROR' -e 'WARN'
ERROR request failed

Die Optionen -w und -x legen fest, was als Treffer gilt. -w findet ein ganzes Wort gemäß den Regeln von grep für Wortzeichen; die Option verlangt weder eine exakte Phrase noch bestimmte Leerzeichen um den Text. -x verlangt, dass die gesamte Eingabezeile dem Muster entspricht. Zum Beispiel kann grep -w 'word' file.txt das Wort word auch in einer Zeile mit weiteren Wörtern finden. grep -Fx 'word' file.txt findet dagegen nur eine Zeile, deren vollständiger Inhalt word ist. Mit -F werden Satzzeichen in beiden Fällen wörtlich behandelt.

grep mit mehreren Zeichenfolgen

Wenn die Liste länger wird oder sich häufig ändert, legen Sie in einer Musterdatei ein Muster pro Zeile ab und übergeben Sie die Datei mit -f. Dieses eigenständige Bash-Beispiel erstellt sowohl die Musterdatei als auch die Protokolldatei in einem temporären Verzeichnis und übergibt grep anschließend ihre tatsächlichen Pfade:

work_dir=$(mktemp -d)
trap 'rm -rf "$work_dir"' EXIT
printf '%s\n' 'WARN disk' 'ERROR request' > "$work_dir/patterns.txt"
printf '%s\n' 'INFO service ready' 'WARN disk almost full' 'ERROR request failed' > "$work_dir/app.log"
grep -F -f "$work_dir/patterns.txt" "$work_dir/app.log"
WARN disk almost full
ERROR request failed

grep -F -f vergleicht jede Eingabezeile mit beiden wörtlichen Mustern und gibt Zeilen aus, die einem der Muster entsprechen. Wenn Sie die Musterdatei direkt übergeben, vermeiden Sie Probleme mit Shell-Anführungszeichen und dem Erzeugen von Zeilenumbrüchen.

Ein Dollarzeichen allein trennt Muster nicht durch einen Zeilenumbruch. Wenn mehrere Muster in einem einzigen Shell-Argument stehen sollen, muss dieses Argument tatsächliche Zeilenumbruchzeichen enthalten. Für eine kurze Liste sind mehrere -e-Optionen übersichtlicher; bei einer längeren Liste lässt sich -f meist einfacher pflegen. Beachten Sie, dass mehrere Muster „eines davon finden“ bedeuten. Verwenden Sie einen regulären Ausdruck mit Lookaheads nur dann, wenn mehrere Begriffe in derselben Zeile vorkommen müssen.

grep mit regulären Ausdrücken

Verwenden Sie -E für erweiterte reguläre Ausdrücke, einschließlich Alternativen. Zum Beispiel findet grep -E 'apple|banana|grape' fruit.txt eine Zeile, die mindestens eine dieser Alternativen enthält. Auch hier genügt ein Treffer: Der Ausdruck verlangt nicht, dass alle Fruchtnamen vorkommen. Verwenden Sie stattdessen -F, wenn die Muster als wörtlicher Text und nicht als Syntax eines regulären Ausdrucks behandelt werden sollen.

Einige grep-Implementierungen unterstützen außerdem -P für Perl-kompatible reguläre Ausdrücke. Auf einem System mit -P-Unterstützung kann ein Lookahead-Muster wie ^(?=.*apple)(?=.*banana)(?=.*grape) verlangen, dass alle drei Begriffe irgendwo in einer Zeile vorkommen. -E unterstützt keine PCRE-Lookaheads, und -P ist nicht in jedem grep-Build verfügbar. Prüfen Sie deshalb das lokale grep-Handbuch, bevor Sie sich darauf verlassen. Ein Muster wie [^@]+@[^.]+.* kann eine grobe, E-Mail-ähnliche Übereinstimmung veranschaulichen, ist aber unvollständig und eignet sich nicht zur E-Mail-Validierung.

Zum Filtern von Text reicht grep oft aus; für umfangreichere Umformungen können awk oder sed besser geeignet sein. Weitere Optionen und Details zur Implementierung finden Sie auf der grep-Handbuchseite.