Einführung in Grep und reguläre Ausdrücke

Einführung in Grep und reguläre Ausdrücke

Zielsetzung

Nach dem Lesen dieses Tutorials sollten Sie verstehen, wie der GREP -Befehl funktioniert und wie Sie es mit grundlegenden und erweiterten regulären Ausdrücken verwenden.

Schwierigkeit

EINFACH

Einführung

Grep ist eines der nützlichsten Tools, die wir bei der Verwaltung eines Unix-basierten Geräts verwenden können.

In diesem Tutorial werden wir sehen, wie man es benutzt, und wir werden auch seine Varianten untersuchen: Egrep Und FGREP. Wir werden diesen wirklich berühmten Auszug aus dem Buch „The Lord of the Rings“ in eine Datei setzen und wir werden als Ziel für unsere Beispiele verwenden:

Drei Ringe für die Elfenkönige unter dem Himmel, sieben für die Zwerglords in ihren Steinhallen, neun für sterbliche Männer, die zum Sterben waren, einen für den dunklen Lord auf seinem dunklen Thron im Land von Mordor, wo die Schatten liegen. Ein Ring, um sie alle zu regieren, ein Ring, um sie zu finden, ein Ring, um sie alle zu bringen, und in der Dunkelheit sie im Land von Mordor, wo die Schatten liegen. 

Die Datei wird aufgerufen lotr.txt.

Grep -Varianten

In der Einführung sprachen wir über zwei Grep -Varianten: Egrep Und FGREP. Diese Varianten sind tatsächlich veraltet, da sie das Äquivalent dazu haben, Grep mit dem zu betreiben -E Und -F Optionen. Bevor wir beginnen, zu erklären, was diese Varianten vom Original unterscheiden.

Der grundlegende reguläre Ausdrucksmodus

Ein regulärer Ausdruck ist ein Muster, das nach bestimmten Regeln konstruiert wurde, um eine Zeichenfolge oder mehrere Zeichenfolgen zu entsprechen. Standardmäßig verwendet Grep das, was es aufruft Bre oder grundlegende reguläre Ausdrücke: In diesem Modus sind nur einige Metabarakter (Zeichen mit einer besonderen Bedeutung innerhalb eines regulären Ausdrucks) verfügbar.

Als erstes Beispiel werden wir versuchen, Grep zu einer sehr einfachen Zeichenfolge zu verwenden, das Wort „sterblich“. Die GREP -Syntax ist sehr einfach: Wir rufen das Programm auf, das das Muster als erstes Argument und die Zieldatei als zweites angibt:

$ Grep Mortal lotr.txt


Der obige Befehl gibt keine Übereinstimmungen zurück, obwohl das Wort „sterblich“ im Text angezeigt wird Fallempfindlichkeit Modus, da das Wort „sterblich“ aktiviert ist, stimmt es nicht dem Muster überein, das wir zur Verfügung gestellt haben. Um dieses Problem zu überwinden und eine „generische“ Suche durchzuführen, können wir die verwenden -ich Option (kurz für --Fall ignorieren, Dadurch ignorieren Grep -Fall Unterscheidungen:

$ grep -i mortal lotr.txt

Diesmal erzeugt der Befehl die folgende Ausgabe (die tatsächliche Übereinstimmung wird rot hervorgehoben):

Neun für sterbliche Männer zum Sterben zum Scheitern verurteilt,

Eine wichtige Sache zu bemerken, ist, dass Grep standardmäßig die gesamte Zeile zurückgibt, in der das Spiel gefunden wird. Dieses Verhalten kann jedoch mit dem geändert werden Option oder seine lange Version --nur Matching. Bei Verwendung dieser Option wird nur das Match selbst gedruckt:

$ grep -o -i sterbliche LOTR.txt sterblich 

Ein weiterer interessanter Schalter, den wir verwenden können, ist -N, kurz für --Zeilennummer. Wenn diese Option verwendet wird, ist die Anzahl der Zeilen, in denen eine Übereinstimmung gefunden wird. Dieser Befehl:

$ grep -n -i sterblicher LOTR.txt

Erzeugt die folgende Ausgabe:

3: neun für sterbliche Männer zum Sterben zum Scheitern verurteilt

Wo 3 ist die Anzahl der Linie, in der das Match gefunden wird.

Was ist, wenn wir nur die tatsächliche Anzahl der gefundenen Übereinstimmungen anstelle der Übereinstimmungen selbst erhalten möchten?? Grep hat eine spezielle Option, um dieses Ergebnis zu erhalten: -C, oder --zählen. Wenn Sie den obigen Befehl mit dieser Option verwenden, gibt die folgende Ausgabe zurück:

1

Dies ist wie erwartet die Anzahl der im Text enthaltenen Übereinstimmungen.

Basis-Metabarakter

Es ist Zeit, eine etwas aufwändigere Suche durchzuführen. Wir möchten jetzt alle Zeilen finden, die mit dem Buchstaben „O“ beginnen. Auch wenn wir mit grundlegenden regulären Ausdrücken arbeiten, können wir die verwenden ^ Zeichen, der mit der leeren Zeichenfolge am Anfang einer Zeile übereinstimmt:



$ grep -i ^o lotr.txt

Wie erwartet ist das Ergebnis des Befehls:

Einer für den dunklen Lord auf seinem dunklen Thron, ein Ring, um sie alle zu regieren, ein Ring, um sie zu finden, ein Ring, um sie alle zu bringen, und in der Dunkelheit sie binden sie, 

Das war ziemlich einfach. Nehmen wir nun an, wir wollen unsere Suche weiter einschränken und alle Zeilen finden, die mit einem „O“ beginnen und mit einem „,“ Charakter enden. Wir können dieses Beispiel verwenden, um einige andere Meta-Charaktere einzuführen, die wir im Basic Regex-Modus verwenden können:

$ grep -i ^o.*, $ lotr.txt

Der obige Linux -Befehl gibt genau zurück, wonach wir gesucht haben:

 Ein Ring, um sie alle zu regieren, ein Ring, um sie zu finden, ein Ring, um sie alle zu bringen, und in der Dunkelheit sie binden sie,  

Erklären wir, was wir oben getan haben. Erstens haben wir die benutzt -ich Option, um unsere Suchfälle zu ermöglichen, genau wie in den vorherigen Beispielen, als wir die verwendeten ^ Meta-Charakter, gefolgt von einem „O“, der nach Zeilen sucht, die mit diesem Brief beginnen.

Wir haben zwei neue verwendet Metabarakter: . Und *. Was ist ihre Rolle im regulären Ausdruck?? Der . entspricht jedem einzelnen Charakter, während die * ist ein Wiederholungsoperator, der dem vorhergehenden Element entspricht null oder mehrmals. Schließlich haben wir die angegeben ,, Ein Komma, das buchstäblich als der letzte Charakter vor dem Ende der Linie abgestimmt ist, passt sich durch die an die $ Meta-Charakter.

Einen Charaktere mit quadratischen Klammern passen

Im obigen Beispiel haben wir den Punkt verwendet, ., Um ein Muster anzugeben, das jedem einzelnen Charakter entspricht. Was ist, wenn wir nur eine Untergruppe von Charakteren anpassen wollten? Sagen Sie zum Beispiel, wir wollten alle Zeilen finden, die mit einem „O“ oder einem „I“ beginnen: Um ein solches Ergebnis zu erzielen, können wir die mögliche Menge möglicher Zeichen in quadratischen Klammern einschließen:

$ grep -i ^[o, ich] lotr.txt

Der Befehl führt eine unempfindliche Suche nach einem „O“ oder einem „I“ durch, das sich am Anfang einer Zeile befindet. Hier ist das Ergebnis:

Einer für den dunklen Lord auf seinem dunklen Thron im Land Mordor, wo die Schatten liegen. Ein Ring, um sie alle zu regieren, ein Ring, um sie zu finden, ein Ring, um sie alle zu bringen, und in der Dunkelheit sie im Land von Mordor, wo die Schatten liegen. 


Damit das Muster übereinstimmt, sollten mindestens eines der mit Halterungen enthaltenen Zeichen gefunden werden. Wenn Sie Zeichen in quadratischen Klammern angeben, können wir auch a angeben Bereich durch Verwendung der - Charakter. Um zum Beispiel Ziffern zu entsprechen, können wir schreiben [0-9]. Zurück zu unserem Text können wir diese Syntax verwenden, um Zeilen mit Buchstaben von „I“ bis „S“ (Fallunempfindlichkeit) zu übereinstimmen:

$ grep -i ^[i -s] lotr.txt

Die Ausgabe des Befehls:

Sieben für die Zwerglorde in ihren Steinhallen, neun für sterbliche Männer zum Tod, einen für den dunklen Lord auf seinem dunklen Thron im Land Mordor, wo die Schatten liegen. Ein Ring, um sie alle zu regieren, ein Ring, um sie zu finden, ein Ring, um sie alle zu bringen, und in der Dunkelheit sie im Land von Mordor, wo die Schatten liegen. 

Das obige ist fast der gesamte Text des Gedicht.

Innerhalb von quadratischen Klammern können wir auch bestimmte Zeichenklassen mit vordefinierter Zeichen übereinstimmen Ausdruck von Klammern. Einige Beispiele sind:

  • [: Alnum:] - Alphanumerische Zeichen
  • [: Ziffer:] - Ziffern von 0 bis 9
  • [: Niedriger:] - Untergeschoss unteren Fallbuchstaben
  • [: obere:] - obere Fallbuchstaben
  • [: leer:] - Leerzeichen und Registerkarten

Die oben genannte ist keine vollständige Liste, aber Sie können problemlos weitere Beispiele für Klammerausdrücke finden, die das GREP -Handbuch beraten.

Das Ergebnis eines Spiels invertieren

In den obigen Beispielen haben wir nach jeder Zeile gesucht, beginnend mit einem „O“ oder einem „I“, indem wir eine unempfindliche Suche anhand von Fall. Was ist, wenn wir die entgegengesetzte Ausgabe erhalten und so nur Linien ohne Übereinstimmungen finden wollten?

Grep ermöglicht es uns, dieses Ergebnis mit dem zu erhalten -v Option (kurz für --Invert-Match). Die Option weist Grep, wie vorgeschlagen, die Option an, das umgekehrte Match zurückzugeben. Wenn wir den letzten Befehl ausführen, den wir oben verwendet haben, sollten wir nur die erste Zeile des Gedichts als Ausgabe erhalten. Überprüfen wir es:

$ grep -i -v ^[i -s] lotr.txt

Das Ergebnis ist genauso wie wir erwartet hatten, nur die erste Zeile des Gedichts:

Drei Ringe für die Elfenkönige unter dem Himmel,

In unserem Beispiel können wir dasselbe Ergebnis erzielen, indem wir die Liste der Zeichen zwischen quadratischen Klammern mit dem Präfixen erhalten ^ Charakter, der in diesem Zusammenhang eine andere Bedeutung annimmt und das Muster dazu bringt, nur Zeichen zu entsprechen, die nicht in der Liste enthalten sind. Wenn wir rennen:

$ grep -i ^[ ^i -s] lotr.txt

Wir erhalten die gleiche Ausgabe wie zuvor:

Drei Ringe für die Elfenkönige unter dem Himmel,

Erweiterter Ausdrucksmodus

Durch die Nutzung Egrep oder grep mit dem -E Option (letzteres ist die empfohlene Weise), können wir auf andere Metabarakter zugreifen, die in regulären Ausdrücken verwendet werden können. Mal sehen, sie.



Fortgeschrittene Wiederholungsbetreiber

Wir haben das bereits getroffen * Wiederholungsoperator, der auch im grundlegenden regulären Ausdrucksmodus verfügbar ist. Bei der Verwendung erweiterter Ausdrücke haben wir Zugriff auf andere Bediener dieser Art:

  • ? - entspricht dem Gegenstand vor ihm ein oder null Mal
  • + - entspricht dem vorhergehenden Element ein oder mehrmals

Wir können auch detailliertere Wiederholungen mithilfe der Curly Braces Syntax angeben. Zum Beispiel entspricht das folgende Muster jedem Auftreten eines doppelten „L“:

grep l 2 lort.txt

Die Ausgabe des obigen Befehls ist:

Sieben für die Zwerglorder in ihren Steinhallen, ein Ring, um sie alle zu regieren, ein Ring, um sie zu finden, ein Ring, um sie alle zu bringen, und in der Dunkelheit sie binden sie, 

Mit der gleichen Syntax können wir eine Mindestanzahl von Vorkommen angeben, indem wir verwenden X,, oder eine ganze mögliche Reichweite mit Verwendung x, y, Wo X Und y darstellen jeweils das Minimum und die maximale Anzahl von Wiederholungen des vorhergehenden Elements.

Wechsel

Bei der Arbeit mit erweiterten regulären Ausdrücken haben wir auch Zugriff auf die | Metabarakter, auch genannt Inflix Operator. Durch die Verwendung können wir zwei reguläre Ausdrücke beitreten und einen Ausdruck erzeugen, der zu jedem Zeichenfolgen entspricht, das beider alternativen Ausdrücke entspricht.

Es ist wichtig zu bemerken, dass beide Seiten der Inflix Der Betreiber wird immer versucht, übereinstimmen zu werden: Dies bedeutet, dass dieser Betreiber nicht als Bedingung funktioniert oder Operator, wo die rechte Seite nur bewertet wird, wenn die linke Seite falsch ist: Dies kann überprüft werden, indem die Ausgabe des folgenden Befehls beobachtet wird:

$ grep -n -e '^o | l 2' lotr.TXT 2: Sieben für die Zwerg-Lords in ihren Steinhallen, 4: Einer für den dunklen Lord auf seinem dunklen Thron 6: Ein Ring, um sie alle zu regieren, ein Ring, um sie zu finden, 7: Ein Ring, um sie alle zu bringen, und in der Dunkelheit binden sie, 

Beobachten Sie die Ausgabe: Jede Linie beginnt mit dem Kapital „O“ oder mit einem doppelten „L“ wurde in die Ausgabe aufgenommen. Auf Zeilen 6 Und 7, Beide Ausdrücke auf der linken und rechten Seite der Inflix Der Bediener produzierte ein Match. Dies bedeutet, wie oben erwähnt.

FGREP

Wenn grep standardmäßig grundlegende reguläre Ausdrücke betrifft und die Verwendung des -E Option oder Egrep Wir können erweiterte reguläre Ausdrücke mit dem verwenden -F Schalter (kurz für -Fixed -Strings) oder FGREP, Wir können das Programm anweisen, ein Muster immer als eine Liste fester Zeichenfolgen zu interpretieren.

Dies bedeutet, dass Saiten immer versucht werden, wörtlich abgestimmt zu werden, und alle Metabarakter verlieren ihre besondere Bedeutung. Dies kann nützlich sein, wenn Sie in einem Text oder einer Zeichenfolge arbeiten, die viele Zeichen enthält, die als Operatoren angesehen werden können, ohne sie manuell entkommen zu müssen.

Gedanken schließen

In diesem Tutorial haben wir gelernt, das zu kennen Grep UNIX -Befehl. Wir haben gesehen, wie wir es verwenden können, um Übereinstimmungen in einem Text mit regulären Ausdrücken zu finden, und wir haben auch das Verhalten seiner Varianten untersucht: Egrep Und FGREP. Wir haben einige sehr nützliche Optionen wie untersucht wie -ich, mit welchen Falls unempfindliche Suchvorgänge durchführen können.

Schließlich machten wir eine Tour durch einige der verwendeten regulären Ausdrücke. Grep ist definitiv eines der wichtigsten Systemwerkzeuge und hat eine sehr umfassende Dokumentation: Beratung Es ist immer eine gute Idee!

Verwandte Linux -Tutorials:

  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Advanced Bash Regex mit Beispielen
  • Mastering -Bash -Skriptschleifen beherrschen
  • Dinge zu installieren auf Ubuntu 20.04
  • Verschachtelte Schleifen in Bash -Skripten
  • Python reguläre Ausdrücke mit Beispielen
  • Mint 20: Besser als Ubuntu und Microsoft Windows?
  • Bash Regexps für Anfänger mit Beispielen
  • GDB -Debugging -Tutorial für Anfänger
  • Big Data Manipulation zum Spaß und Gewinn Teil 3