Reguläre Unix-Ausdrücke. Verwenden von Grep und regulären Ausdrücken zum Suchen von Textmustern unter Linux. ▍E-Mail-Adressen überprüfen

💖 Gefällt es dir? Teilen Sie den Link mit Ihren Freunden

Einer der nützlichsten und funktionsreichsten Befehle im Linux-Terminal ist der Befehl „grep“. Grep ist ein Akronym, das für „Global Regular Expression Print“ steht (d. h. „überall nach Zeichenfolgen suchen, die einem regulären Ausdruck entsprechen, und diese ausdrucken“). Das bedeutet, dass grep verwendet werden kann, um zu sehen, ob die Eingabe mit bestimmten Mustern übereinstimmt.

Dieses scheinbar triviale Programm ist bei richtiger Anwendung sehr leistungsfähig. Seine Fähigkeit, Eingaben anhand komplexer Regeln zu sortieren, macht es zu einem beliebten Glied in vielen Befehlsketten.

In diesem Tutorial werden einige der Funktionen des grep-Befehls vorgestellt und anschließend mit der Verwendung regulärer Ausdrücke fortgefahren. Alle in diesem Handbuch beschriebenen Techniken können auf die Verwaltung eines virtuellen Servers angewendet werden.

Grundlagen der Nutzung

In seiner einfachsten Form wird grep verwendet, um Übereinstimmungen von Buchstabenmustern in einer Textdatei zu finden. Das heißt, wenn grep ein Suchwort gegeben wird, wird jede Zeile in der Datei gedruckt, die dieses Wort enthält.

Beispielsweise können Sie grep verwenden, um Zeilen zu finden, die das Wort „GNU“ in Version 3 der GNU General Public License auf einem Ubuntu-System enthalten.

cd /usr/share/common-licenses
grep „GNU“ GPL-3
GNU ALLGEMEINE ÖFFENTLICHE LIZENZ





13. Verwendung mit der GNU Affero General Public License.
unter Version 3 der GNU Affero General Public License in eine einzige Datei
...
...

Das erste Argument, „GNU“, ist das zu suchende Muster und das zweite Argument, „GPL-3“, ist die zu findende Eingabedatei.

Als Ergebnis werden alle Zeilen ausgegeben, die das Textmuster enthalten. In einigen Linux-Distributionen Das gesuchte Muster wird in den Ausgabezeilen hervorgehoben.

Allgemeine Optionen

Standardmäßig sucht der grep-Befehl einfach nach streng spezifizierten Mustern in der Eingabedatei und gibt die gefundenen Zeilen aus. Das Verhalten von grep kann jedoch durch Hinzufügen einiger zusätzlicher Flags geändert werden.

Wenn Sie die Groß-/Kleinschreibung des Suchparameters ignorieren und sowohl nach Groß- als auch Kleinbuchstabenvarianten des Musters suchen müssen, können Sie die Dienstprogramme „-i“ oder „--ignore-case“ verwenden.

Beispielsweise können Sie grep verwenden, um dieselbe Datei nach dem Wort „license“ zu durchsuchen, das in Groß-, Klein- oder Mischbuchstaben geschrieben ist.

grep -i „Lizenz“ GPL-3
GNU ALLGEMEINE ÖFFENTLICHE LIZENZ
dieses Lizenzdokuments, eine Änderung ist jedoch nicht gestattet.
Die GNU General Public License ist eine kostenlose Copyleft-Lizenz für
Die Lizenzen für die meisten Software- und anderen praktischen Arbeiten sind entworfen
Die GNU General Public License soll Ihre Freiheit garantieren
GNU General Public License für den Großteil unserer Software; es gilt auch für


„Diese Lizenz“ bezieht sich auf Version 3 der GNU General Public License.
„Das Programm“ bezieht sich auf alle urheberrechtlich geschützten Werke, die im Rahmen dieser Lizenz lizenziert werden
...
...

Wie Sie sehen können, enthält die Ausgabe „LICENSE“, „license“ und „License“. Wenn eine Instanz von „LiCeNsE“ in der Datei vorhanden wäre, würde diese ebenfalls ausgegeben.
Wenn Sie alle Zeilen finden müssen, die das angegebene Muster nicht enthalten, können Sie die Flags „-v“ oder „--invert-match“ verwenden.

Als Beispiel könnten Sie den folgenden Befehl verwenden, um die BSD-Lizenz nach allen Zeilen zu durchsuchen, die nicht das Wort „the“ enthalten:

grep -v „das“ BSD
Alle Rechte vorbehalten.
Weiterverbreitung und Nutzung in Quell- und Binärform, mit oder ohne
erfüllt sind:
dürfen verwendet werden, um von dieser Software abgeleitete Produkte zu unterstützen oder zu bewerben
ohne vorherige ausdrückliche schriftliche Genehmigung.
DIESE SOFTWARE WIRD VON DEN REGENTEN UND MITARBEITERN „WIE BESEHEN“ UND ZUR VERFÜGUNG GESTELLT
JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNGEN, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE
...
...

Wie Sie sehen können, wurden die letzten beiden Zeilen so ausgegeben, dass sie das Wort „the“ nicht enthielten, da der Befehl „Groß-/Kleinschreibung ignorieren“ nicht verwendet wurde.

Es ist immer nützlich, die Zeilennummern zu kennen, in denen die Übereinstimmungen gefunden wurden. Sie können mit den Flags „-n“ oder „--line-number“ gefunden werden.

Wenn Sie dieses Flag im vorherigen Beispiel anwenden, wird das folgende Ergebnis angezeigt:

grep -vn „das“ BSD
2:Alle Rechte vorbehalten.
3:
4: Weiterverbreitung und Nutzung in Quell- und Binärform, mit oder ohne
6:sind erfüllt:
13: kann verwendet werden, um von dieser Software abgeleitete Produkte zu unterstützen oder zu bewerben
14: ohne ausdrückliche vorherige schriftliche Genehmigung.
15:
16: DIESE SOFTWARE WIRD VON DEN REGENTEN UND MITARBEITERN „WIE BESEHEN“ ZUR VERFÜGUNG GESTELLT
17: JEGLICHE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNGEN, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE
...
...

Sie können jetzt auf die Zeilennummer zurückgreifen, wenn Sie Änderungen an jeder Zeile vornehmen müssen, die „the“ nicht enthält.

Reguläre Ausdrücke

Wie in der Einleitung erwähnt, steht grep für „Global Regular Expression Print“. Ein regulärer Ausdruck ist eine Textzeichenfolge, die ein bestimmtes Suchmuster beschreibt.

Verschiedene Anwendungen und Programmiersprachen verwenden reguläre Ausdrücke etwas unterschiedlich. Dieses Tutorial behandelt nur einen kleinen Teil der Möglichkeiten, Muster für Grep zu beschreiben.

Buchstabenübereinstimmungen

In den obigen Beispielen zur Suche nach den Wörtern „GNU“ und „the“ wurde nach sehr einfachen regulären Ausdrücken gesucht, die genau mit der Zeichenfolge „GNU“ und „the“ übereinstimmten.

Es ist richtiger, sie als Übereinstimmungen von Zeichenfolgen und nicht als Übereinstimmungen von Wörtern zu betrachten. Sobald Sie mit komplexeren Mustern vertraut sind, wird diese Unterscheidung an Bedeutung gewinnen.

Muster, die genau mit bestimmten Zeichen übereinstimmen, werden „Buchstabenmuster“ genannt, weil sie Buchstabe für Buchstabe und Zeichen für Zeichen mit dem Muster übereinstimmen.

Alle alphabetischen und numerischen Zeichen (und einige andere Zeichen) stimmen wörtlich überein, sofern sie nicht durch andere Ausdrucksmechanismen geändert wurden.

Ankerspiele

Anker sind Sonderzeichen, die die Position der gewünschten Übereinstimmung in einer Zeichenfolge angeben.

Sie können beispielsweise festlegen, dass für die Suche nur Zeilen benötigt werden, die ganz am Anfang das Wort „GNU“ enthalten. Dazu müssen Sie den Anker „^“ vor der Buchstabenfolge verwenden.

In diesem Beispiel werden nur Zeilen gedruckt, die am Anfang das Wort „GNU“ enthalten.

grep „^GNU“ GPL-3
GNU General Public License für den Großteil unserer Software; es gilt auch für
GNU General Public License, Sie können jede jemals veröffentlichte Version wählen

Ebenso kann der Anker „$“ nach einer Literalzeichenfolge verwendet werden, um anzugeben, dass die Übereinstimmung nur gültig ist, wenn die gesuchte Zeichenfolge am Ende der Textzeichenfolge steht.

Der folgende reguläre Ausdruck gibt nur die Zeilen aus, die am Ende „und“ enthalten:

grep „and$“ GPL-3
dass es für diese kostenlose Software keine Garantie gibt. Für beide Benutzer“ und
Die genauen Bedingungen für die Vervielfältigung, Verbreitung und


Alternative ist nur gelegentlich und nicht kommerziell erlaubt und
Netzwerk kann verweigert werden, wenn die Änderung selbst materiell und
den Betrieb des Netzwerks beeinträchtigt oder gegen die Regeln verstößt und
vorläufig, es sei denn und bis der Urheberrechtsinhaber ausdrücklich und
erhält von den ursprünglichen Lizenzgebern eine Lizenz zum Ausführen, Ändern und
herstellen, nutzen, verkaufen, zum Verkauf anbieten, importieren und anderweitig betreiben, modifizieren und

Passen Sie zu jedem Charakter

Der Punkt (.) wird in regulären Ausdrücken verwendet, um anzugeben, dass jedes Zeichen an der angegebenen Stelle erscheinen kann.

Wenn Sie beispielsweise Übereinstimmungen finden möchten, die zwei Zeichen und dann die Sequenz „cept“ enthalten, würden Sie das folgende Muster verwenden:

grep „..cept“ GPL-3
Verwendung, und zwar genau dort, wo sie am inakzeptabelsten ist. Deshalb, wir
Verletzung gemäß geltendem Urheberrecht, außer der Ausführung auf a
teilt dem Benutzer mit, dass es keine Garantie für das Werk gibt (außer für die

Form einer gesondert schriftlichen Lizenz oder als Ausnahmen angegeben;
Es ist Ihnen nicht gestattet, ein betroffenes Werk zu verbreiten oder zu verändern, es sei denn, dies ist ausdrücklich gestattet
9. Für den Erhalt von Kopien ist keine Annahme erforderlich.
...
...

Wie Sie sehen, umfassen die Ergebnisse die Wörter „akzeptieren“ und „außer“ sowie Variationen dieser Wörter. Das Muster würde auch mit der Sequenz „z2cept“ übereinstimmen, wenn es im Text stünde.

Ausdrücke in Klammern

Indem Sie eine Gruppe von Zeichen in eckige Klammern („“) setzen, können Sie angeben, dass jedes der Zeichen in den Klammern an dieser Position erscheinen kann.

Das heißt, wenn Sie Zeichenfolgen finden müssen, die „too“ oder „two“ enthalten, können Sie diese Variationen mithilfe des folgenden Musters kurz angeben:

grep „zu“ GPL-3
auch Ihre Programme.

Entwickler, die die GNU GPL verwenden, schützen Ihre Rechte in zwei Schritten:
Ein Computernetzwerk ohne Übertragung einer Kopie übermittelt nicht.

Entsprechende Quelle von einem Netzwerkserver kostenlos.
...
...

Wie Sie sehen, wurden beide Varianten in der Datei gefunden.

Auch das Setzen von Zeichen in Klammern bietet mehrere nützliche Funktionen. Sie können angeben, dass alles außer den Zeichen in Klammern mit dem Muster übereinstimmt, indem Sie die Liste der Zeichen in Klammern mit dem Zeichen „^“ beginnen.

In diesem Beispiel wird das Muster „.ode“ verwendet, das nicht mit der Sequenz „code“ übereinstimmen darf.

grep „[^c]ode“ GPL-3
1. Quellcode.
Modell, um jedem, der den Objektcode besitzt, entweder (1) a
die einzige wesentliche Verwendungsart des Produkts.
Beachten Sie Folgendes, wenn es im interaktiven Modus startet:

Es ist erwähnenswert, dass die Ausgabe der zweiten Zeile das Wort „Code“ enthält. Dies ist kein Regex- oder Grep-Fehler.

Diese Zeile wurde vielmehr gedruckt, weil sie auch die Mustervergleichssequenz „mode“ enthält, die im Wort „model“ vorkommt. Das heißt, die Zeichenfolge wurde gedruckt, weil sie mit dem Muster übereinstimmte.

Noch eine nützliche Funktion Klammern – die Möglichkeit, einen Zeichenbereich anzugeben, anstatt jedes Zeichen einzeln einzugeben.

Das heißt, wenn Sie jede Zeile finden müssen, die mit einem Großbuchstaben beginnt, können Sie das folgende Muster verwenden:

grep „^“ GPL-3
GNU General Public License für den Großteil unserer Software; es gilt auch für

Lizenz. Jeder Lizenznehmer wird mit „Sie“ angesprochen. „Lizenzen“ und


Systembibliotheken oder Allzweck-Tools oder allgemein kostenlos verfügbar
Quelle.

...
...

Aufgrund einiger vererbter Sortierprobleme ist es für genauere Ergebnisse besser, Zeichenklassen zu verwenden POSIX-Standard anstelle des im obigen Beispiel verwendeten Zeichenbereichs.
Es gibt viele Zeichenklassen, die in diesem Handbuch nicht behandelt werden. Um beispielsweise den gleichen Vorgang wie im obigen Beispiel durchzuführen, können Sie die Zeichenklasse „[:upper:]“ in Klammern verwenden.

grep "^[[:upper:]]" GPL-3
GNU General Public License für den Großteil unserer Software; es gilt auch für
Staaten sollten nicht zulassen, dass Patente die Entwicklung und Nutzung einschränken
Lizenz. Jeder Lizenznehmer wird mit „Sie“ angesprochen. „Lizenzen“ und
Komponente und (b) dient lediglich dazu, die Nutzung des Werks damit zu ermöglichen
Hauptkomponente oder zur Implementierung einer Standardschnittstelle, für die eine
Systembibliotheken oder Allzweck-Tools oder allgemein kostenlos verfügbar
Quelle.
Das Benutzerprodukt wird auf unbestimmte Zeit oder für einen bestimmten Zeitraum an den Empfänger übertragen
...
...

Muster wiederholen (0 oder mehr Mal)

Eines der am häufigsten verwendeten Metazeichen ist das „*“-Symbol, das „das vorherige Zeichen oder den vorherigen Ausdruck mindestens 0 Mal wiederholen“ bedeutet.

Wenn Sie beispielsweise jede Zeile mit öffnenden oder schließenden Klammern finden möchten, die nur Buchstaben und einzelne Leerzeichen dazwischen enthält, können Sie den folgenden Ausdruck verwenden:

grep "(*)" GPL-3

Verbreitung (mit oder ohne Änderung), Bereitstellung für die
als das Werk als Ganzes, das (a) in der Normalform enthalten ist
Komponente und (b) dient lediglich dazu, die Nutzung des Werks damit zu ermöglichen
(falls vorhanden), auf dem die ausführbare Arbeit ausgeführt wird, oder ein früherer Compiler
(einschließlich eines physischen Verteilungsmediums), begleitet von der
(einschließlich eines physischen Verteilungsmediums), begleitet von a
Ort (kostenlos oder gegen Gebühr) und bieten gleichwertigen Zugang zum
...
...

So vermeiden Sie Metazeichen

Manchmal müssen Sie möglicherweise nach einem wörtlichen Punkt oder einer wörtlichen offenen Klammer suchen. Da diese Zeichen in regulären Ausdrücken eine bestimmte Bedeutung haben, müssen Sie sie „maskieren“, indem Sie grep mitteilen, dass ihre spezielle Bedeutung in diesem Fall nicht benötigt wird.

Diese Zeichen können mit einem Backslash (\) vor dem Zeichen maskiert werden, das normalerweise eine besondere Bedeutung hat.

Wenn Sie beispielsweise eine Zeichenfolge suchen müssen, die mit einem Großbuchstaben beginnt und mit einem Punkt endet, können Sie den folgenden Ausdruck verwenden. Der Backslash vor dem letzten Punkt weist den Befehl an, ihn zu „escapen“, sodass der letzte Punkt einen wörtlichen Punkt darstellt und keine „irgendein Zeichen“-Bedeutung hat:

grep "^.*\.$" GPL-3
Quelle.
Lizenz durch Ausnahmen von einer oder mehreren ihrer Bedingungen.
Die Lizenz würde darin bestehen, vollständig auf die Übermittlung des Programms zu verzichten.
ALLE ERFORDERLICHEN WARTUNGSARBEITEN, REPARATUREN ODER KORREKTUR.
SOLCHE SCHÄDEN.
Fügen Sie außerdem Informationen dazu hinzu, wie Sie per E-Mail und Papierpost kontaktiert werden können.

Erweiterte reguläre Ausdrücke

Der Befehl Grep kann auch mit einer erweiterten Sprache für reguläre Ausdrücke verwendet werden, indem das Flag -E verwendet oder der Befehl egrep anstelle von grep aufgerufen wird.

Diese Befehle eröffnen die Möglichkeiten „erweiterter regulärer Ausdrücke“. Erweiterte reguläre Ausdrücke umfassen alle grundlegenden Metazeichen sowie zusätzliche Metazeichen, um komplexere Übereinstimmungen auszudrücken.

Gruppierung

Eine der einfachsten und nützlichsten Funktionen erweiterter regulärer Ausdrücke ist die Möglichkeit, Ausdrücke zu gruppieren und als einzelne Einheit zu verwenden.

Klammern werden zum Gruppieren von Ausdrücken verwendet. Wenn Sie Klammern außerhalb erweiterter regulärer Ausdrücke verwenden müssen, können diese mithilfe eines Backslashs „escaped“ werden

grep „\(grouping\)“ file.txt
grep -E "(gruppierung)" file.txt
egrep „(grouping)“ file.txt

Die obigen Ausdrücke sind äquivalent.

Wechsel

So wie eckige Klammern etwas anderes definieren Möglichkeiten Wenn eine Übereinstimmung mit einem einzelnen Zeichen übereinstimmt, können Sie durch Interleaving alternative Übereinstimmungen für Zeichenfolgen oder Ausdruckssätze angeben.

Das Symbol wird verwendet, um den Wechsel anzuzeigen vertikale Linie„|“. Bei der Gruppierung wird häufig die Abwechslung verwendet, um anzugeben, dass eine von zwei oder mehr möglichen Optionen als Übereinstimmung betrachtet werden sollte.

In diesem Beispiel müssen Sie nach „GPL“ oder „General Public License“ suchen:

grep -E „(GPL|General Public License)“ GPL-3
Die GNU General Public License ist eine kostenlose Copyleft-Lizenz für
Die GNU General Public License soll Ihre Freiheit garantieren
GNU General Public License für den Großteil unserer Software; es gilt auch für
Preis. Unsere General Public Licenses sollen sicherstellen, dass Sie
Entwickler, die die GNU GPL verwenden, schützen Ihre Rechte in zwei Schritten:
Zum Schutz der Entwickler und Autoren erklärt die GPL dies klar
Um den Autoren zuliebe verlangt die GPL, dass geänderte Versionen als markiert werden
haben diese Version der GPL entworfen, um diese Praxis für diejenigen zu verbieten
...
...

Mit Alternation kann zwischen zwei oder mehr Optionen gewählt werden; Dazu müssen Sie die restlichen Optionen in die Auswahlgruppe eintragen und diese jeweils durch das vertikale Balkensymbol „|“ trennen.

Quantifizierer

In erweiterten regulären Ausdrücken gibt es Metazeichen, die angeben, wie oft ein Zeichen wiederholt wird, ähnlich wie das Metazeichen „*“ angibt, dass das vorherige Zeichen oder die vorherige Zeichenfolge null oder mehrmals übereinstimmt.

Um ein Zeichen 0-mal oder öfter zu finden, können Sie das Zeichen „?“ verwenden. Dadurch wird das vorherige Zeichen oder die vorherige Zeichenreihe im Wesentlichen optional.

In diesem Beispiel werden durch Einfügen der Sequenz „copy“ in die optionale Gruppe Übereinstimmungen „copyright“ und „right“ angezeigt:

grep -E "(copy)?right" GPL-3
Copyright (C) 2007 Free Software Foundation, Inc.
Um Ihre Rechte zu schützen, müssen wir verhindern, dass andere Ihnen diese verweigern
diese Rechte zu widerrufen oder Sie zum Verzicht auf die Rechte aufzufordern. Deshalb haben Sie
kennen ihre Rechte.
Entwickler, die die GNU GPL verwenden, schützen Ihre Rechte in zwei Schritten:
(1) das Urheberrecht an der Software geltend machen und (2) Ihnen diese Lizenz anbieten
Unter „Urheberrecht“ versteht man auch urheberrechtsähnliche Gesetze, die auch für andere Arten von Urheberrechten gelten
...
...

Das Zeichen „+“ stimmt mit Ausdrücken mindestens einmal überein. Es funktioniert fast wie das Symbol „*“, aber bei Verwendung von „+“ muss der Ausdruck mindestens einmal übereinstimmen.

Der folgende Ausdruck entspricht der Zeichenfolge „free“ plus einem oder mehreren Zeichen, die keine Leerzeichen sind:

grep -E "free[^[:space:]]+" GPL-3
Die GNU General Public License ist eine kostenlose Copyleft-Lizenz für
um Ihnen die Freiheit zu nehmen, die Werke zu teilen und zu verändern. Im Gegensatz,
Die GNU General Public License soll Ihre Freiheit garantieren
Wenn wir von freier Software sprechen, beziehen wir uns nicht auf Freiheit
haben die Freiheit, Kopien kostenloser Software zu verbreiten (und dafür eine Gebühr zu erheben).

Freiheiten, die Sie erhalten haben. Sie müssen sicherstellen, dass auch sie empfangen
Schutz der Freiheit der Benutzer, die Software zu ändern. Die Systematik
der GPL, soweit dies zum Schutz der Freiheit der Benutzer erforderlich ist.
Patente können nicht dazu verwendet werden, das Programm unfrei zu machen.

Anzahl der wiederholten Übereinstimmungen

Bei Bedarf können Sie verwenden Zahnspange(„( )“). Diese Symbole werden verwendet, um die genaue Anzahl, den Bereich sowie die Ober- und Untergrenze der Anzahl der Übereinstimmungen eines Ausdrucks anzugeben.

Wenn Sie alle Zeilen finden müssen, die eine Kombination aus drei Vokalen enthalten, können Sie den folgenden Ausdruck verwenden:

grep -E "(3)" GPL-3
geändert, so dass ihre Probleme nicht fälschlicherweise zugeschrieben werden
Autoren früherer Versionen.
Empfangen Sie es in einem beliebigen Medium, sofern Sie es auffällig und deutlich machen
gemäß dem vorherigen Absatz geben, plus ein Recht auf den Besitz der
abgedeckte Arbeit, um gleichzeitig Ihren Verpflichtungen aus diesem Vertrag nachzukommen
Wenn Sie alle Wörter mit 16–20 Zeichen finden müssen, verwenden Sie den folgenden Ausdruck:
grep -E "[[:alpha:]](16,20)" GPL-3
bestimmte Verantwortlichkeiten, wenn Sie Kopien der Software verteilen oder wenn
Sie ändern es: Verantwortung, die Freiheit anderer zu respektieren.
c) Verbot einer falschen Darstellung der Herkunft dieses Materials, oder

Schlussfolgerungen

In vielen Fällen ist der Befehl grep nützlich, um Muster innerhalb von Dateien oder in einer Hierarchie zu finden Dateisystem. Das spart viel Zeit, daher lohnt es sich, sich mit den Parametern und der Syntax vertraut zu machen.

Reguläre Ausdrücke sind noch multifunktionaler und vielseitig einsetzbar beliebte Programme. Zum Beispiel viele Texteditoren Verwenden Sie reguläre Ausdrücke, um Text zu suchen und zu ersetzen.

Darüber hinaus verwenden fortgeschrittene Programmiersprachen reguläre Ausdrücke, um Prozeduren für bestimmte Daten auszuführen. Zu wissen, wie man mit regulären Ausdrücken arbeitet, ist bei der Lösung häufiger Computerprobleme hilfreich.

Stichworte: ,

Reguläre Ausdrücke sind ein sehr leistungsfähiges Werkzeug zum Durchsuchen von Text nach Mustern sowie zum Verarbeiten und Ändern von Zeichenfolgen, mit dem sich viele Probleme lösen lassen. Hier sind die wichtigsten:

  • Überprüfung der Texteingabe;
  • Text in einer Datei suchen und ersetzen;
  • Stapelumbenennung von Dateien;
  • Interaktion mit Diensten wie Apache;
  • Überprüfen einer Zeichenfolge auf Übereinstimmung mit einem Muster.

Das ist noch lange nicht der Fall volle Liste Mit regulären Ausdrücken können Sie noch viel mehr tun. Aber für neue Benutzer könnten sie zu kompliziert erscheinen, da sie eine spezielle Sprache verwenden, um sie zu erstellen. Angesichts der bereitgestellten Funktionen sollte jedoch jeder Systemadministrator reguläre Linux-Ausdrücke kennen und verwenden können.

In diesem Artikel werfen wir einen Blick auf reguläre Bash-Ausdrücke für Anfänger, damit Sie alle Funktionen dieses Tools verstehen.

Es gibt zwei Arten von Zeichen, die in regulären Ausdrücken verwendet werden können:

  • gewöhnliche Briefe;
  • Metazeichen.

Gemeinsame Zeichen sind die Buchstaben, Zahlen und Satzzeichen, aus denen jede Zeichenfolge besteht. Alle Texte bestehen aus Buchstaben und Sie können diese in regulären Ausdrücken verwenden, um die gewünschte Position im Text zu finden.

Metazeichen sind etwas anderes, sie verleihen regulären Ausdrücken ihre Kraft. Mit Metazeichen können Sie viel mehr tun, als nur nach einem einzelnen Zeichen zu suchen. Sie können nach Symbolkombinationen suchen, eine dynamische Anzahl von Symbolen verwenden und Bereiche auswählen. Alle Sonderzeichen können in zwei Typen unterteilt werden: Ersatzzeichen, die normale Zeichen ersetzen, und Operatoren, die angeben, wie oft ein Zeichen wiederholt werden kann. Die Syntax des regulären Ausdrucks würde so aussehen:

regulärer_Charakter Sonderzeichen_Operator

spezielles_Ersatzzeichen Sonderzeichen_Operator

  • \ - Alphabetische Sonderzeichen beginnen mit einem Backslash und werden auch verwendet, wenn Sie ein Sonderzeichen in Form eines Satzzeichens verwenden müssen.
  • ^ - gibt den Anfang der Zeile an;
  • $ - zeigt das Ende der Zeile an;
  • * – gibt an, dass das vorherige Zeichen 0 oder öfter wiederholt werden darf;
  • + – gibt an, dass das vorherige Zeichen einmal oder mehrmals wiederholt werden soll;
  • ? - Das vorherige Zeichen kann null oder einmal vorkommen;
  • (N)- gibt an, wie oft (n) das vorherige Zeichen wiederholt werden soll;
  • (N,n)- Das vorherige Zeichen kann N- bis n-mal wiederholt werden.
  • . - jedes Zeichen außer Zeilenvorschub;
  • - jedes in Klammern angegebene Zeichen;
  • x|y- Symbol x oder Symbol y;
  • [^az]- jedes Zeichen außer den in Klammern angegebenen;
  • - jedes Zeichen aus dem angegebenen Bereich;
  • [^a-z]- jedes Zeichen, das nicht im Bereich liegt;
  • \B- bezeichnet eine Wortgrenze mit einem Leerzeichen;
  • \B– bedeutet, dass das Zeichen innerhalb eines Wortes stehen muss, z. B. ux stimmt mit uxb oder tuxedo überein, aber nicht mit Linux;
  • \D- bedeutet, dass das Symbol eine Zahl ist;
  • \D- nicht digitales Symbol;
  • \N- Zeilenvorschubzeichen;
  • \S- eines der Leerzeichen, Leerzeichen, Tabulatorzeichen usw.;
  • \S- jedes Zeichen außer Leerzeichen;
  • \T- Tabulatorzeichen;
  • \v- vertikales Tabulatorzeichen;
  • \w- jedes alphabetische Zeichen, einschließlich Unterstrich;
  • \W- jedes alphabetische Zeichen außer dem Unterstrich;
  • \uXXX- Unicdoe-Symbol.

Es ist wichtig zu beachten, dass Sie vor alphabetischen Sonderzeichen einen Schrägstrich verwenden müssen, um anzuzeigen, dass als nächstes ein Sonderzeichen folgt. Umgekehrt gilt auch: Wenn Sie ein Sonderzeichen, das ohne Schrägstrich verwendet wird, als reguläres Zeichen verwenden möchten, müssen Sie einen Schrägstrich hinzufügen.

Sie möchten beispielsweise die Zeile 1+ 2=3 im Text finden. Wenn Sie diese Zeichenfolge als regulären Ausdruck verwenden, werden Sie nichts finden, da das System das Plus als Sonderzeichen interpretiert, das angibt, dass die vorherige Einheit ein oder mehrere Male wiederholt werden soll. Es muss also maskiert werden: 1 \+ 2 = 3. Ohne Escape würde unser regulärer Ausdruck nur mit der Zeichenfolge 11=3 oder 111=3 usw. übereinstimmen. Es ist nicht nötig, vor „equal“ eine Zeile zu setzen, da es sich hierbei nicht um ein Sonderzeichen handelt.

Beispiele für die Verwendung regulärer Ausdrücke

Nachdem wir nun die Grundlagen behandelt haben und Sie wissen, wie alles funktioniert, müssen Sie nur noch das erworbene Wissen über reguläre Linux-Grep-Ausdrücke in der Praxis festigen. Zwei sehr nützliche Sonderzeichen sind ^ und $, die den Anfang und das Ende einer Zeile angeben. Wir möchten beispielsweise alle Benutzer in unserem System registrieren lassen, deren Name mit s beginnt. Dann können Sie einen regulären Ausdruck verwenden „^s“. Sie können den Befehl egrep verwenden:

egrep "^s" /etc/passwd

Wenn wir Zeilen basierend auf dem letzten Zeichen in der Zeile auswählen möchten, können wir hierfür $ verwenden. Wählen wir beispielsweise alle Systembenutzer ohne Shell aus. Datensätze über solche Benutzer enden mit „false“:

egrep „false$“ /etc/passwd

Um Benutzernamen anzuzeigen, die mit s oder d beginnen, verwenden Sie diesen Ausdruck:

egrep „^“ /etc/passwd

Das gleiche Ergebnis kann durch Verwendung des Symbols „|“ erzielt werden. Die erste Option eignet sich eher für Bereiche und die zweite wird häufiger für reguläre oder/oder:

egrep „^“ /etc/passwd

Wählen wir nun alle Benutzer aus, deren Name nicht mehr als drei Zeichen lang ist. Der Benutzername endet mit einem Doppelpunkt. Wir können sagen, dass es jedes beliebige alphabetische Zeichen enthalten kann, das vor dem Doppelpunkt dreimal wiederholt werden muss:

egrep "^\w(3):" /etc/passwd

Schlussfolgerungen

In diesem Artikel haben wir uns mit regulären Linux-Ausdrücken befasst, aber das waren nur die Grundlagen. Wenn Sie etwas tiefer graben, werden Sie feststellen, dass Sie mit diesem Tool noch viel mehr interessante Dinge tun können. Es wird sich auf jeden Fall lohnen, sich die Zeit zu nehmen, reguläre Ausdrücke zu beherrschen.

Zum Abschluss ein Vortrag von Yandex über reguläre Ausdrücke:

Einer der nützlichsten und funktionsreichsten Befehle im Linux-Terminal ist der Befehl „grep“. Der Name ist ein Akronym Englischer Satz„Global nach Zeilen suchen, die dem regulären Ausdruck entsprechen, und sie drucken“ (überall nach Zeilen suchen, die dem regulären Ausdruck entsprechen, und sie drucken). Der Befehl „grep“ durchsucht den Eingabestream Zeile für Zeile, sucht nach Übereinstimmungen und gibt (filtert) nur die Zeilen aus, die Text enthalten, der dem angegebenen Muster entspricht – regulären Ausdruck.

Reguläre Ausdrücke sind eine spezielle formale Sprache zum Suchen und Bearbeiten von Teilzeichenfolgen in Texten, die auf der Verwendung von Metazeichen basiert. Jetzt fast alles moderne Sprachen Programmierprogramme verfügen über integrierte Unterstützung für reguläre Ausdrücke für die Textverarbeitung. Historisch gesehen wurde die Popularisierung dieses Ansatzes jedoch weitgehend durch die UNIX-Welt und insbesondere durch die in den Befehlen „grep“, „sed“ usw. eingebetteten Ideen erleichtert. Die Philosophie „Alles ist eine Datei“ durchdringt UNIX vollständig und der Besitz von Tools für die Arbeit mit Textdateien gehört zu den erforderlichen Fähigkeiten für jeden Linux-Benutzer.

PROBE

GIST | Eine einfache Suche nach allen Zeilen, die den Text „Adams“ enthalten. Bei der Formatierung dieses und der folgenden Beispiele halten wir uns an die folgende Reihenfolge: Befehlszeilenparameter oben, Standard-Streams unten, stdin-Eingabe links und stdout-Ausgabe rechts.

Der Befehl „grep“ verfügt über eine beeindruckende Anzahl von Optionen, die Sie beim Ausführen angeben können. Mit diesen Optionen können Sie viele nützliche Dinge tun, und Sie müssen nicht einmal mit der Syntax regulärer Ausdrücke vertraut sein.

OPTIONEN

Beginnen wir mit der Tatsache, dass „grep“ nicht nur die Standardeingabe stdin filtern, sondern auch Dateien durchsuchen kann. Standardmäßig durchsucht grep nur Dateien im aktuellen Verzeichnis, aber mit der sehr nützlichen Option --recursive können Sie grep anweisen, rekursiv ausgehend von einem bestimmten Verzeichnis zu suchen.

GIST | Standardmäßig berücksichtigt der grep-Befehl die Groß-/Kleinschreibung. Das folgende Beispiel zeigt, wie Sie ohne Berücksichtigung der Groß- und Kleinschreibung suchen können, zum Beispiel sind „Adams“ und „Adams“ dasselbe:

Groß-/Kleinschreibung „adams“ ignorieren

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 John Adams, 1797–1801

GIST | Die Suche ist das Gegenteil (manchmal sagt man auch invertierte Suche), das heißt, es werden alle Zeilen angezeigt, außer denen, in denen das angegebene Muster vorkommt:

Invert-Match „Adams“

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 George Washington, 1789–1797 Thomas Jefferson, 1801–1809

GIST | Natürlich können und sollten Optionen miteinander kombiniert werden. Zum Beispiel eine umgekehrte Suche mit Anzeige der Seriennummern von Zeilen mit Vorkommen:

Zeilennummer --invert-match „Adams“

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 1:George Washington, 1789–1797 3:Thomas Jefferson, 1801–1809

GIST | Färbung. Manchmal ist es praktisch, wenn das gesuchte Wort farblich hervorgehoben ist. All dies ist bereits in „grep“ enthalten, es müssen nur noch Folgendes hinzugefügt werden:

Zeilennummer --color=always „Adams“

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 2:John Adams, 1797–1801

GIST | Wir möchten alle Fehler aus der Protokolldatei auswählen, wissen aber, dass die nächste Zeile nach dem Fehler Folgendes enthalten kann eine nützliche Information, dann ist es praktisch, mehrere Zeilen aus dem Kontext auszugeben. Standardmäßig gibt grep nur die Zeile aus, in der die Übereinstimmung gefunden wurde, es gibt jedoch mehrere Optionen, um grep dazu zu bringen, mehr zu drucken. Um mehrere Zeilen (in unserem Fall zwei) nach einem Eintrag anzuzeigen:

Farbe=immer -A2 „Adams“

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 James Madison, 1809–1817 James Monroe, 1817–1825 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 James Madison, 1809–1817

GIST | Ebenso für die zusätzliche Ausgabe mehrerer Zeilen vor dem Eintrag:

Farbe=immer -B2 „James“

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 James Madison, 1809–1817 James Monroe, 1817–1825 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 James Madison, 1809–1817 James Monroe , 1817-1825

GIST | In den meisten Fällen muss jedoch ein symmetrischer Kontext angezeigt werden; hierfür gibt es eine noch kürzere Notation. Lassen Sie uns zwei Zeilen über und unter dem Eintrag drucken:

Farbe=immer -C2 „James“

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 James Madison, 1809–1817 James Monroe, 1817–1825 John Quincy Adams, 1825–1829 Andrew Jackson, 1829–1837 Martin Van Buren, 1837–1841 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 James Madison, 1809–1817 James Monroe, 1817–1825 John Quincy Adams, 1825–1829 Andrew Jackson, 1829–1837

GIST | Wenn Sie nach qwe suchen, gibt „grep“ standardmäßig auch qwe123, 345qwerty und ähnliche Kombinationen aus. Suchen wir nur die Zeilen, die das ganze Wort ausschalten:

Word-regexp --color=always „John“

John Fitzgerald Kennedy, 1961-1963 Lyndon Baines Johnson, 1963-1969 John Fitzgerald Kennedy, 1961-1963

GIST | Und schließlich, wenn Sie nur die Anzahl der Zeilen mit Übereinstimmungen mit einer einzelnen Zahl wissen möchten, aber nichts anderes anzeigen möchten:

Count --color=always „John“

John Fitzgerald Kennedy, 1961–1963 Lyndon Baines Johnson, 1963–1969 Richard Milhous Nixon, 1969–1974 2

Es ist erwähnenswert, dass die meisten Optionen ein Gegenstück haben, zum Beispiel kann --ignore-case auf die kürzere Form -i usw. reduziert werden.

GRUNDLEGENDE REGELMÄßIGE AUSDRÜCKE

Alle regulären Ausdrücke bestehen aus zwei Arten von Zeichen: sogenannten Standardtextzeichen Literale, und Sonderzeichen genannt Metazeichen. In den vorherigen Beispielen wurde die Suche mithilfe von Literalen (genaue Übereinstimmung der Buchstaben) durchgeführt, aber das Folgende wird viel interessanter sein. Willkommen in der Welt der regulären Ausdrücke!

Das Caretzeichen ^ und das Dollarzeichen $ haben in einem regulären Ausdruck eine besondere Bedeutung. Sie werden „Anker“ genannt. Anker sind Sonderzeichen, die die Position der gewünschten Übereinstimmung in einer Zeichenfolge angeben. Wenn die Suche einen Anker erreicht, prüft sie, ob es eine Übereinstimmung gibt, und wenn ja, folgt sie dem Muster weiter. ohne dem Ergebnis etwas hinzuzufügen.

GIST | Der Caret-Anker wird verwendet, um anzuzeigen, dass der reguläre Ausdruck vom Anfang der Zeile an getestet werden muss:

Farbe=immer „^J“

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 John Adams, 1797–1801

GIST | Ebenso sollte der Dollar-Anker am Ende des Musters verwendet werden, um anzuzeigen, dass die Übereinstimmung nur gültig ist, wenn die gesuchte Zeichenfolge am Ende der Textzeichenfolge steht und nicht anders:

Farbe=immer „9$“

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 Thomas Jefferson, 1801–1809

GIST | Jeder Charakter. Das Punktzeichen wird in regulären Ausdrücken verwendet, um anzugeben, dass an der angegebenen Stelle absolut jedes Zeichen erscheinen kann:

Farbe=immer „0.$“

GIST | Abschirmung. Wenn Sie genau das Punktsymbol finden müssen, hilft die Escape-Funktion. Ein Escape-Zeichen (normalerweise ein Backslash) vor einem Zeichen wie einem Punkt verwandelt das Metazeichen in ein Literal:

Farbe=immer „\.“

George Washington. 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 George Washington. 1789-1797

GIST | Charakterklassen. Reguläre Ausdrücke können Bereiche und Zeichenklassen verwenden. Hierzu werden beim Erstellen der Vorlage eckige Klammern verwendet. Indem Sie eine Gruppe von Zeichen (einschließlich Zeichen, die andernfalls als Metazeichen interpretiert würden) in eckige Klammern setzen, können Sie angeben, dass jedes der Zeichen in den Klammern an dieser Position erscheinen kann:

Farbe=immer „0“

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 John Adams, 1797–1801 Thomas Jefferson, 1801–1809

GIST | Reichweite. Dies sind zwei durch einen Bindestrich getrennte Zeichen, zum Beispiel 0-9 (Dezimalziffern) oder 0-9a-fA-F (Hexadezimalziffern):

Farbe=immer „“

George Washington, ??? John Adams, 1797–1801 Thomas Jefferson, 1801–1809 John Adams, 1797–1801 Thomas Jefferson, 1801–1809

GIST | Negation. Wenn das erste Zeichen des Ausdrucks in eckigen Klammern ein Caretzeichen ist, werden die restlichen Zeichen als eine Reihe von Zeichen betrachtet, die an der angegebenen Position des regulären Ausdrucks nicht vorhanden sein sollten:

Farbe=immer „[^7]$“

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 John Adams, 1797–1801 Thomas Jefferson, 1801–1809

GIST | POSIX-Zeichenklassen. Es gibt einen bestimmten Satz vorgefertigter Zeichenklassen, die Sie in regulären Ausdrücken verwenden können. Es gibt ungefähr ein Dutzend davon. Schauen Sie sich einfach kurz das Handbuch an, um den Zweck jedes einzelnen zu verstehen. Lassen Sie uns beispielsweise nur hexadezimale Ziffern filtern:

Farbe=immer „^[[:xdigit:]]*$“

4,2 42 42abc 42 42abc

GIST | Wiederholen (0 oder öfter). Eines der am häufigsten verwendeten Metazeichen ist das Sternchensymbol, das „das vorherige Zeichen oder den vorherigen Ausdruck null oder mehrmals wiederholen“ bedeutet:

Farbe=immer „^*$“

George Washington, ??? John Adams, 1797-1801 Thomas Jefferson, 1801-1809 George Washington, ???

Es gibt grundlegende reguläre Ausdrücke BRE (Basic Regular Expressions) und erweiterte reguläre Ausdrücke ERE (Extended Regular Expressions). Die folgenden Metazeichen werden in BRE erkannt: ^$. * und alle anderen Zeichen werden als Literale behandelt. Wurden die folgenden Metazeichen zu ERE () ( ) hinzugefügt? + | und verwandte Funktionen. Nun, um alle völlig zu verwirren, haben sie sich dieses Ding in „grep“ ausgedacht – die Zeichen () ( ) in BRE werden als Metazeichen behandelt, wenn sie mit einem Backslash maskiert werden, während in ERE ein Backslash davor steht Alle Metazeichen führen dazu, dass sie wie Literale behandelt werden.

ERWEITERTE REGELMÄßIGE AUSDRÜCKE

GIST | Disjunktion. So wie eckige Klammern verschiedene mögliche Übereinstimmungen für ein einzelnes Zeichen angeben, können Sie mit einer Disjunktion alternative Übereinstimmungen für Zeichenfolgen oder Ausdrücke angeben. Das vertikale Balkensymbol wird verwendet, um die Disjunktion anzuzeigen:

Extended-regexp --color=always „George|John“

George Washington, 1789–1797 John Adams, 1797–1801 Thomas Jefferson, 1801–1809 George Washington, 1789–1797 John Adams, 1797–1801

GIST | Passen Sie null oder einmal an. In erweiterten regulären Ausdrücken gibt es mehrere zusätzliche Metazeichen, die angeben, wie oft ein Zeichen oder Ausdruck wiederholt wird (ähnlich wie das Sternchen-Metazeichen Übereinstimmungen mit 0 oder mehr Malen anzeigt). Ein solches Metazeichen ist das Fragezeichen, das das vorherige Zeichen oder den vorherigen Ausdruck im Wesentlichen optional macht:

Extended-regexp --color=always "^(Andrew)?John"

John Adams, 1797–1801 Andrew Johnson, 1865–1869 Lyndon Baines Johnson, 1963–1969 John Adams, 1797–1801 Andrew Johnson, 1865–1869

GIST | Passen Sie ein oder mehrere Male an. Zu diesem Zweck wird ein Metazeichen in Form eines Pluszeichens bereitgestellt. Es funktioniert fast wie das Sternchensymbol, außer dass der Ausdruck mindestens einmal übereinstimmen muss:

Extended-regexp --color=always "^[[:alpha:] ]+$"

John Adams Andrew Johnson, 1865-1869 Lyndon Baines Johnson, 1963-1969 John Adams

GIST | Entspricht der angegebenen Häufigkeit. Hierzu können Sie geschweifte Klammern verwenden. Diese Metazeichen werden verwendet, um die genaue Anzahl, den Bereich sowie die Ober- und Untergrenze der Anzahl der Übereinstimmungen eines Ausdrucks anzugeben:

Extended-regexp --color=always "(1,3)\.(1,3)\.(1,3)\.(1,3)"

42 127.0.0.1 127.0.0.1

Der grep-Befehl ist so nützlich, funktionsreich und einfach zu verwenden, dass Sie sich nicht mehr vorstellen können, ohne ihn zu arbeiten, wenn Sie ihn erst einmal kennen.

grep steht für „Global Regular Expression Printer“. grep schneidet die benötigten Zeilen aus Textdateien die benutzerdefinierten Text enthalten.

grep kann auf zwei Arten verwendet werden – allein oder in Kombination mit Streams.

grep verfügt aufgrund der großen Anzahl unterstützter Optionen über eine sehr umfangreiche Funktionalität, z. B. Suche mithilfe eines Zeichenfolgenmusters oder eines RegExp-Musters für reguläre Ausdrücke oder Perl-basierter regulärer Ausdrücke usw.

Aufgrund seiner Andersartigkeit Funktionalität Das grep-Tool bietet viele Optionen, darunter egrep (Erweitertes GREP), fgrep (Fixiertes GREP), pgrep (GREP verarbeiten), rgrep (rekursives GREP) usw. Diese Optionen unterscheiden sich jedoch geringfügig vom ursprünglichen grep.

grep-Optionen

$ grep -V grep (GNU grep) 2.10 Copyright (C) 2011 Free Software Foundation, Inc. Lizenz GPLv3+

Es gibt Modifikationen des grep-Dienstprogramms: egrep (mit erweiterter Verarbeitung regulärer Ausdrücke), fgrep (das $*^|()\-Symbole als Literale, d. h. wörtlich, behandelt), rgrep (mit aktivierter rekursiver Suche).

    egrep ist dasselbe wie grep -E

    fgrep ist dasselbe wie grep -F

    rgrep ist dasselbe wie grep -r

    grep [-b] [-c] [-i] [-l] [-n] [-s] [-v] eingeschränkter_regex_BRE [Datei ...]

Der Befehl grep gleicht Zeilen in Quelldateien mit dem durch „limited_regex“ angegebenen Muster ab. Wenn keine Dateien angegeben sind, wird die Standardeingabe verwendet. Normalerweise wird jede erfolgreich abgeglichene Zeichenfolge in die Standardausgabe kopiert. Bei mehreren Quelldateien wird der Dateiname vor der gefundenen Zeile angegeben. grep verwendet einen kompakten, nicht deterministischen Algorithmus. Eingeschränkte reguläre Ausdrücke (Ausdrücke, die Zeichenfolgen mit ihrer Bedeutung haben und einen begrenzten Satz an alphanumerischen Zeichen und Sonderzeichen verwenden) werden als Vorlagen betrachtet. Sie haben die gleiche Bedeutung wie reguläre Ausdrücke in ed.

Um die Zeichen $, *, , ^, |, () und \ aus der Shell-Interpretation zu maskieren, ist es am einfachsten, den constrained_regex in einfache Anführungszeichen zu setzen.

Optionen:

B Stellt jeder Zeile die Blocknummer voran, in der sie gefunden wurde. Dies kann nützlich sein, wenn Sie nach Blöcken nach Kontext suchen (Blöcke werden beginnend mit 0 nummeriert). -c Gibt nur die Anzahl der Zeilen aus, die das Muster enthalten. -h Verhindert, dass der Dateiname, der die übereinstimmende Zeile enthält, vor der Zeile selbst gedruckt wird. Wird bei der Suche über mehrere Dateien hinweg verwendet. -i Ignoriert die Groß-/Kleinschreibung bei Vergleichen. -l Gibt nur die Namen der Dateien aus, die die passenden Zeichenfolgen enthalten, eine pro Zeile. Wenn ein Muster in mehreren Zeilen einer Datei gefunden wird, wird der Dateiname nicht wiederholt. -n Gibt vor jeder Zeile ihre Nummer in der Datei aus (Zeilen werden beginnend mit 1 nummeriert). -s Unterdrückt Meldungen über nicht vorhandene oder nicht lesbare Dateien. -v Druckt alle Zeilen außer denen, die ein Muster enthalten. -w Sucht den Ausdruck als Wort, als ob er von Metazeichen umgeben wäre \< и \>.

grep --help

Verwendung: grep [OPTION]... PATTERN [DATEI]... Sucht nach PATTERN in jeder DATEI oder Standardeingabe. Standardmäßig ist PATTERN ein einfacher regulärer Ausdruck (BRE). Beispiel: grep -i "hello world" menu.h main.c Auswahl des Typs des regulären Ausdrucks und seiner Interpretation: -E, --extended-regexp PATTERN – erweiterter regulärer Ausdruck (ERE) -F, --fixed-regexp PATTERN - Zeichenfolgen fester Länge, getrennt durch ein Zeilenumbruchzeichen -G, --basic-regexp PATTERN - einfacher regulärer Ausdruck (BRE) -P, --perl-regexp PATTERN - reguläre Perl-Ausdrücke -e, --regexp=PATTERN verwenden Sie PATTERN, um Suche - f, --file=DATEI MUSTER aus DATEI übernehmen -i, --ignore-case Groß-/Kleinschreibung ignorieren -w, --word-regexp MUSTER muss mit allen Wörtern übereinstimmen -x, --line-regexp MUSTER muss mit der gesamten Zeile übereinstimmen -z, --null-data Zeilen werden durch ein Null-Byte statt durch ein Zeilenendezeichen getrennt. Sonstiges: -s, --no-messages Fehlermeldungen unterdrücken -v, --revert-match nicht übereinstimmende Zeilen auswählen -V, - - version Versionsinformationen drucken und beenden --help diese Hilfe anzeigen und beenden --mmap aus Gründen der Abwärtskompatibilität, ignoriert Ausgabesteuerung: -m, --max-count=NUM stoppt, nachdem die angegebene NUM übereinstimmt -b, --byte- offset drucken der Byte-Offset zusammen mit den Ausgabezeilen -n, --line-number gibt die Zeilennummer zusammen mit den Ausgabezeilen aus --line-buffered leert den Puffer nach jeder Zeile -H, --with-filename gibt jeweils den Dateinamen aus match -h , --no-filename startet die Ausgabe nicht mit dem Dateinamen --label=LABEL verwendet LABEL als Dateinamen für die Standardeingabe -o, --only-matching zeigt nur den Teil der Zeile an, der mit dem MUSTER übereinstimmt -q, --quiet, - -silent unterdrückt alle normalen Ausgaben. --binary-files=TYPE setzt voraus, dass die Binärdatei den Typ Binär, Text oder Ohne Übereinstimmung hat. -a, --text dasselbe wie --binary-files=text -I dasselbe wie --binary-files=without-match -d, --directories=ACTION wie mit Verzeichnissen umgegangen wird ACTION kann gelesen werden), rekursiv (rekursiv) oder überspringen (überspringen). -D, --devices=ACTION wie mit Geräten, FIFOs und Sockets umgegangen wird ACTION kann gelesen oder übersprungen werden -R, -r, --recursive wie --directories=recurse --include=F_PATTERN verarbeitet nur Dateien, die unter F_TEMPLATE übereinstimmen - -exclude=F_TEMPLATE Dateien und Verzeichnisse überspringen, die mit F_TEMPLATE übereinstimmen --exclude-from=DATEI Dateien überspringen, die mit den Vorlagendateien aus DATEI übereinstimmen --exclude-dir=TEMPLATE-Verzeichnisse, die mit MUSTER übereinstimmen, werden übersprungen -L, - -files-without-match nur drucken DATEI-Namen ohne Übereinstimmungen -l, --files-with-matches gibt nur DATEI-Namen mit Übereinstimmungen aus -c, --count gibt nur die Anzahl der übereinstimmenden Zeilen pro DATEI aus -T, --initial-tab Tab ausrichten (falls erforderlich) - Z, --null druckt Byte 0 nach dem DATEI-Namen. Kontextverwaltung: -B, --before-context=NUM druckt die ANZAHL der Zeilen des vorhergehenden Kontexts. -A, --after-context=NUM druckt die ANZAHL der Zeilen von der nachfolgende Kontext -C, --context[=NUMBER] gibt die ANZAHL der Kontextzeilen aus. -NUMBER ist dasselbe wie --context=NUMBER --color[=WHEN], --colour[=WHEN] verwendet Markierungen, um Übereinstimmungen zu unterscheiden Linien; WHEN kann immer, nie oder automatisch sein. -U, --binary CR-Zeichen am Ende der Zeile nicht entfernen (MSDOS) -u, --unix-byte-offsets Offset anzeigen, als gäbe es keine CR-Zeichen (MSDOS). ) Anstelle von „egrep“ soll „grep -E“ ausgeführt werden. Anstelle von „fgrep“ wird „grep -F“ angenommen. Es ist besser, nicht als „egrep“ oder „fgrep“ auszuführen. Wenn FILE nicht angegeben ist oder FILE den Wert - hat, wird die Standardeingabe gelesen. Wenn weniger als zwei Dateien angegeben sind, wird -h angenommen. Wenn eine Übereinstimmung gefunden wird, ist der Exit-Code 0, andernfalls 1. Wenn Fehler auftreten oder wenn die Option -q nicht angegeben ist, lautet der Exit-Code 2. Melden Sie Fehler an: Bitte melden Sie Fehler in der Übersetzung an: GNU Grep-Homepage: Hilfe zum Arbeiten mit GNU-Programmen:

Das Dienstprogramm grep ist ein sehr leistungsfähiges Tool zum Suchen und Filtern von Textinformationen. Dieser Artikel zeigt mehrere Anwendungsbeispiele, die es Ihnen ermöglichen, seine Fähigkeiten zu schätzen.
Der Hauptzweck von grep ist die Suche nach Wörtern oder Phrasen in Dateien und Ausgabestreams. Sie können durch Eingabe suchen Befehlszeile Abfrage- und Suchbereich (Datei).
Um beispielsweise die Zeichenfolge „needle“ in der Datei hystack.txt zu finden, verwenden Sie den folgenden Befehl:

$ grep Needle haystack.txt

Als Ergebnis zeigt grep alle Vorkommen von Needle an, die es im Inhalt der Datei haystack.txt findet. Es ist wichtig zu beachten, dass grep in diesem Fall nach einer Reihe von Zeichen und nicht nach einem Wort sucht. Beispielsweise werden Zeichenfolgen angezeigt, die das Wort „needless“ enthalten, und andere Wörter, die die Sequenz „needle“ enthalten.


Um grep mitzuteilen, dass Sie nach einem bestimmten Wort suchen, verwenden Sie den Schalter -w. Dieser Schlüssel beschränkt die Suche nur auf das angegebene Wort. Ein Wort ist eine Suchanfrage, die auf beiden Seiten durch Leerzeichen, Satzzeichen oder Zeilenumbrüche begrenzt ist.

$ grep -w Needle haystack.txt

Es ist nicht notwendig, die Suche auf nur eine Datei zu beschränken; grep kann eine Gruppe von Dateien durchsuchen und die Suchergebnisse geben die Datei an, in der die Übereinstimmung gefunden wurde. Der Schalter -n fügt außerdem die Zeilennummer hinzu, in der die Übereinstimmung gefunden wurde, und der Schalter -r ermöglicht Ihnen die Durchführung einer rekursiven Suche. Dies ist sehr praktisch, wenn Sie Dateien mit Programmquellcodes durchsuchen.

$ grep -rnw Funktionsname /home/www/dev/myprogram/

Der Dateiname wird vor jedem Treffer aufgelistet. Wenn Sie Dateinamen ausblenden müssen, verwenden Sie den Schalter -h. Wenn Sie hingegen nur Dateinamen benötigen, geben Sie den Schalter -l an
Im folgenden Beispiel suchen wir nach URLs in der IRC-Protokolldatei und zeigen die letzten 10 Übereinstimmungen an.

$ grep -wo http://.*channel.log | Schwanz

Die Option -o weist grep an, nur die Musterübereinstimmung und nicht die gesamte Zeile zu drucken. Mithilfe von Pipe leiten wir die Ausgabe von grep an den Befehl tail um, der standardmäßig die letzten 10 Zeilen ausgibt.
Jetzt zählen wir die Anzahl der Nachrichten, die von bestimmten Benutzern an den IRC-Kanal gesendet wurden. Zum Beispiel alle Nachrichten, die ich von zu Hause und von der Arbeit gesendet habe. Sie unterscheiden sich im Spitznamen, zu Hause verwende ich den Spitznamen user_at_home und bei der Arbeit user_at_work.

$ grep -c "^user_at_(home|work)" channel.log

Mit der Option -c gibt grep nur die Anzahl der gefundenen Übereinstimmungen aus, nicht die Übereinstimmungen selbst. Der Suchstring wird in Anführungszeichen gesetzt, da er Sonderzeichen enthält, die von der Shell als Steuerzeichen erkannt werden können. Bitte beachten Sie, dass Anführungszeichen nicht im Suchmuster enthalten sind. Der Backslash „“ wird verwendet, um Sonderzeichen zu maskieren.
Suchen wir im Kanal nach Nachrichten von Leuten, die gerne „schreien“. Mit „Schrei“ meinen wir Nachrichten, die im Blondy-Stil in Großbuchstaben geschrieben sind. Um zufällige Treffer von Abkürzungen von der Suche auszuschließen, suchen wir nach Wörtern mit fünf oder mehr Zeichen:

$ grep -w "+(5,)" Kanal.log

Eine detailliertere Beschreibung finden Sie auf der grep-Manpage.
Noch ein paar Beispiele:

# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash Operator:x:11:0:operator:/root:/sbin/nologin

Zeigt Zeilen aus der Datei /etc/passwd an, die den Zeichenfolgenstamm enthalten.

# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin

Zusätzlich werden die Zeilennummern angezeigt, die die gesuchte Zeile enthalten.

# grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync Shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin :/sbin/halt news:x:9:13:news:/var/spool/news: mailnull:x:47:47::/var/spool/mqueue:/dev/null xfs:x:43:43: X Font Server:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper RPC user:/:/bin/false nscd:x:28:28:NSCD Daemon:/:/bin/false benannt:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP-Benutzer: /var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false

Überprüft, welche Benutzer Bash nicht verwenden, schließt die Benutzerkonten aus, für deren Shell nologin angegeben ist.

# grep -c false /etc/passwd 7

Zählt die Anzahl der Konten, deren Shell /bin/false ist.

# grep -i games ~/.bash* | grep -v Geschichte

Dieser Befehl zeigt Zeilen aller Dateien im Home-Verzeichnis des aktuellen Benutzers an, deren Namen mit ~/.bash beginnen, mit Ausnahme derjenigen Dateien, deren Namen die Zeichenfolge „history“ enthalten, um Übereinstimmungen in ~/.bash_history auszuschließen, in denen dieselbe Zeichenfolge angegeben werden kann in Groß- oder Kleinschreibung. Bitte beachten Sie, dass die Suche nach dem Wort „Spiele“ erfolgt; Sie können stattdessen jedes andere Wort verwenden.
grep-Befehl und reguläre Ausdrücke

Im Gegensatz zum vorherigen Beispiel werden wir jetzt nur die Zeilen anzeigen, die mit der Zeile „root“ beginnen:

# grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash

Wenn wir sehen möchten, welche Konten die Shell überhaupt nicht verwendet haben, suchen wir nach Zeilen, die mit einem :-Zeichen enden:

# grep:$ /etc/passwd news:x:9:13:news:/var/spool/news:

Um zu überprüfen, ob die PATH-Variable in Ihrer ~/.bashrc-Datei exportiert wird, wählen Sie zunächst die Zeilen mit „export“ aus und suchen Sie dann nach Zeilen, die mit der Zeile „PATH“ beginnen. In diesem Fall werden MANPATH und andere mögliche Pfade nicht angezeigt:

# grep export ~/.bashrc | grep "PATH" export PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

Charakterklassen

Der Ausdruck in eckigen Klammern ist eine Liste von Zeichen, die in den Zeichen [“ und „]“ eingeschlossen sind. Es entspricht jedem einzelnen in dieser Liste angegebenen Zeichen. Wenn das erste Zeichen der Liste „^“ ist, dann stimmt es mit jedem Zeichen überein, das NICHT in der Liste enthalten ist. Beispielsweise entspricht der reguläre Ausdruck „“ einer beliebigen einzelnen Ziffer.

Innerhalb eines Ausdrucks in eckigen Klammern können Sie einen Bereich angeben, der aus zwei durch einen Bindestrich getrennten Zeichen besteht. Dann stimmt der Ausdruck mit jedem Singleton überein, der gemäß den Sortierregeln in diese beiden Zeichen fällt, einschließlich dieser beiden Zeichen; Dabei werden die im Gebietsschema angegebene Sortierung und der Zeichensatz berücksichtigt. Wenn das Standardgebietsschema beispielsweise C ist, entspricht der Ausdruck „“ dem Ausdruck „“. Es gibt viele Gebietsschemas, in denen die Sortierung in Wörterbuchreihenfolge erfolgt, und in diesen Gebietsschemas ist „“ im Allgemeinen nicht äquivalent zu „“, in denen es beispielsweise äquivalent zum Ausdruck „“ sein kann. Um die traditionelle Interpretation des in eckigen Klammern angegebenen Ausdrucks zu verwenden, können Sie das C-Gebietsschema verwenden, indem Sie es auf festlegen Umgebungsvariable LC_ALL-Wert „C“.

Schließlich gibt es noch speziell benannte Zeichenklassen, die innerhalb von Ausdrücken in eckigen Klammern angegeben werden. Weitere Informationen zu diesen vordefinierten Ausdrücken finden Sie in den Manpages oder in der Dokumentation zum grep-Befehl.

# grep /etc/group sys:x:3:root,bin,adm tty:x:5: mail:x:12:mail,postfix ftp:x:50: nobody:x:99: floppy:x:19: xfs:x:43: nfsnobody:x:65534: postfix:x:89:

Das Beispiel zeigt alle Zeilen an, die entweder das Zeichen „y“ oder das Zeichen „f“ enthalten.
Universelle Zeichen (Metazeichen)

Verwenden "." um jedem einzelnen Zeichen zu entsprechen. Wenn Sie eine Liste aller erhalten möchten englische Wörter, entnommen aus einem Wörterbuch, enthält fünf Zeichen, die mit „c“ beginnen und mit „h“ enden (nützlich zum Lösen von Kreuzworträtseln):

# grep " " /usr/share/dict/words Catch Clash Cloth Coach Couch Husten Crash Crush

Wenn Sie Zeilen anzeigen möchten, die ein Punktzeichen als Literal enthalten, geben Sie im grep-Befehl die Option -F an. Symbole "< " и «>" bedeutet das Vorhandensein einer Leerzeile vor und dementsprechend nach den angegebenen Buchstaben. Das bedeutet, dass die Wörter in der Wortdatei entsprechend geschrieben werden müssen. Wenn Sie alle Wörter im Text nach den angegebenen Mustern finden möchten, ohne sie zu berücksichtigen leere Zeilen lassen Sie die „ Zeichen weg< " и «>", für mehr präzise Suche Nur Wörter verwenden den Schalter -w.

Um auf ähnliche Weise Wörter zu finden, die eine beliebige Anzahl von Zeichen zwischen „c“ und „h“ enthalten können, verwenden Sie ein Sternchen (*). Im folgenden Beispiel werden alle Wörter, die mit „c“ beginnen und mit „h“ enden, aus dem Systemwörterbuch ausgewählt:

# grep " " /usr/share/dict/words Kalif Bargeld fängt Käsetuch-Gepard --Ausgabe weggelassen--

Wenn Sie das Literal-Sternchen in einer Datei oder einem Ausgabestream finden möchten, verwenden Sie einfache Anführungszeichen, um es zu finden. Der Benutzer im folgenden Beispiel versucht zunächst, ohne Anführungszeichen in der Datei /etc/profile nach einem „Sternchen“ zu suchen, was dazu führt, dass nichts gefunden wird. Bei Verwendung von Anführungszeichen wird das Ergebnis ausgegeben:

# grep * /etc/profile # grep "*" /etc/profile for i in /etc/profile.d/*.sh ; Tun



Freunden erzählen