Verwenden von Grep mit mehreren Zeichenketten

Niraj Menon 22 März 2022
Verwenden von Grep mit mehreren Zeichenketten

Als Bash-Skriptautor befinden Sie sich möglicherweise in einer Situation, in der Sie eine Textwand nach relevanten Informationen durchsuchen müssen. Manchmal sind diese Informationen ungeordnet, sodass Sie ein Muster finden müssen, um alle relevanten Daten zu erfassen.

Das beste Werkzeug für diesen Job unter Linux ist grep, geschrieben von Ken Thompson um 1973. grep ist auf allen modernen UNIX-Systemen verfügbar.

In diesem Tutorial wird die Verwendung von grep ausführlich behandelt, von grundlegenden Beispielen wie dem Erfassen einer einzelnen Phrase bis zum Erfassen mehrerer Muster mit RegEx oder festen Zeichenketten, wobei eine Bash-Befehlszeile vorausgesetzt wird.

Verwenden von grep zum Erfassen einfacher Sätze

Der einfachste Weg, grep zu verwenden, besteht darin, die Vorkommen einer Phrase in einer Datei zu finden. Bei einem Zielwort und einer Datei können wir wie gezeigt nach dem Wort in der Datei suchen.

user@linux:~$ cat file.txt
UNIX
tutorial
word
words
sword
tests
Linux

user@linux:~$ grep word file.txt
word
words
sword

Wie Sie oben sehen können, werden alle Wörter erfasst, die den Teilstring word enthalten.

Sie können auch die Ausgabe eines Programms erfassen und die Ausgabe wie gezeigt nach einer Phrase grep. Wir verwenden die Datei weiterhin als Beispiel, aber Sie können dies mit jedem Programm tun, das auf stdout druckt.

user@linux:~$ cat file.txt | grep word
word
words
sword

Wenn Sie es vorziehen, dass grep nur die Phrasen ausgibt, die genau übereinstimmen (dh Leerzeichen um sie herum haben und keine Teilzeichenfolgen anderer Wörter sind), können Sie das Flag -w/--word-regexp verwenden, um ganze zu aktivieren Wortübereinstimmung.

Sie können die gleiche Idee verwenden, um Phrasen abzugleichen, wenn sie als einzelne Zeile erscheinen, mit -x/--line-regexp.

user@linux:~$ cat file.txt | grep -w word
word

grep mit mehreren Strings

Um mehrere durch Zeilenumbrüche getrennte Phrasen zu verwenden, um relevante Übereinstimmungen in einer Datei oder einem Textstream aus einem Programm zu erfassen, können Sie sie mit -F/--fixed-strings angeben.

Sie können stattdessen für eine kleine Anzahl von Übereinstimmungen eine unten gezeigte Zeichenfolge übergeben, wobei ein Dollarzeichen einen Zeilenumbruch anzeigt.

grep -F "words$word" file.txt
# or
fgrep "words$word" file.txt

Für eine größere Liste aus einer Datei können Sie mit cat die Datei als Argument für grep ausdrucken und dieselbe Syntax wiederverwenden.

user@linux:~$ cat match.txt
word
sword
user@linux:~$ fgrep "$(cat match.txt)" file.txt
word
words
sword

grep mit RegEx

Dieser Abschnitt ist äußerst praktisch, wenn Sie mit RegEx vertraut sind. Mit -E/--extended-regexp können Sie ein RegEx-Muster angeben, um kompliziertere Formulierungen zu erfassen, die nicht mit einer oder mehreren Phrasen erfasst werden können.

Bei einer Datei, die zufällig E-Mail-Adressen und URLs enthält, möchten wir möglicherweise Zeilen herausfiltern, die mit E-Mails oder URLs übereinstimmen, mit separaten Aufrufen des Befehls grep.

Ein einfaches, meist naives RegEx-Muster zum Erfassen von E-Mails wäre [^\@]+\@[^\.]+.*. Um dies mit grep zu verwenden, können Sie Folgendes tun:

user@linux:~$ cat file.txt 
user@linux.com
linux@torvalds.com
not a URL or email
https://www.google.com/
https://apple.com/
not an email or URL
user@linux:~$ egrep '[^\@]+\@[^\.]+.*' file.txt
user@linux.com
linux@torvalds.com

Ein weiteres Beispiel, das RegEx verwendet, ist die Angabe mehrerer Muster, um zu sehen, ob jedes einzelne davon in einer Datei vorhanden ist. Dazu haben wir das folgende Muster.

Beachten Sie den Vergleich zwischen den beiden im Beispiel unten verwendeten RegEx-Mustern – eines verwendet den ODER-Operator, und das andere ist so geschrieben, dass die Zeile alle drei Wörter enthalten muss.

user@linux:~$ cat file.txt
apple banana grape
bus lamppost bench
apple bench grape
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P 'apple|banana|grape' file.txt
apple banana grape
apple bench grape
banana grape apple
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P '^(?=.*apple)(?=.*banana)(?=.*grape)' file.txt
apple banana grape
banana grape apple

Denken Sie daran, dass grep nicht das einzige String-Matching-Tool ist, das Ihnen in UNIX-Systemen zur Verfügung steht. Sie können auch awk verwenden, um komplizierte Muster zu erfassen. Sie können auch sed verwenden, um Phrasen basierend auf übereinstimmenden Kriterien zu ersetzen.

Dieses Tutorial hat Informationen von der Handbuchseite grep erhalten, auf die Sie zugreifen können, indem Sie man grep in einem beliebigen UNIX-Terminal oder auf dieser Seite eingeben.