Einführung
Der Befehl grep
ist einer der nützlichsten Befehle in einer Linux-Terminalumgebung. Der Name grep
steht für „global regular expression print“. Dies bedeutet, dass Sie grep
verwenden können, um zu überprüfen, ob die Eingabe, die es erhält, einem bestimmten Muster entspricht. Dieses scheinbar triviale Programm ist äußerst leistungsstark; seine Fähigkeit, Eingaben basierend auf komplexen Regeln zu sortieren, macht es zu einem beliebten Element in vielen Befehlsketten.
In diesem Tutorial werden Sie die Optionen des Befehls grep
erkunden und dann in die Verwendung von regulären Ausdrücken eintauchen, um fortgeschrittenere Suchvorgänge durchzuführen.
Voraussetzungen
Um diesem Leitfaden zu folgen, benötigen Sie Zugriff auf einen Computer, der ein Linux-basiertes Betriebssystem ausführt. Dies kann entweder ein virtueller privater Server sein, mit dem Sie über SSH verbunden sind, oder Ihr lokaler Computer. Beachten Sie, dass dieses Tutorial unter Verwendung eines Linux-Servers, der Ubuntu 20.04 ausführt, validiert wurde, aber die gegebenen Beispiele auf einem Computer mit jeder Version einer beliebigen Linux-Distribution funktionieren sollten.
Wenn Sie planen, einen Remote-Server zu verwenden, um dieser Anleitung zu folgen, empfehlen wir Ihnen, zuerst unseren Anleitung zur Initialisierung des Servers abzuschließen. Dadurch werden Sie mit einer sicheren Serverumgebung eingerichtet – einschließlich eines nicht-root-Benutzers mit sudo
-Berechtigungen und einer Firewall, die mit UFW konfiguriert ist – die Sie nutzen können, um Ihre Linux-Fähigkeiten aufzubauen.
Grundlegende Nutzung
In diesem Tutorial verwenden Sie grep
, um die GNU General Public License Version 3 nach verschiedenen Wörtern und Phrasen zu durchsuchen.
Wenn Sie ein Ubuntu-System verwenden, finden Sie die Datei im Ordner /usr/share/common-licenses
. Kopieren Sie sie in Ihr Home-Verzeichnis:
Wenn Sie ein anderes System verwenden, verwenden Sie den curl
-Befehl, um eine Kopie herunterzuladen:
Sie werden auch die BSD-Lizenzdatei in diesem Tutorial verwenden. Auf Linux können Sie diese mit folgendem Befehl in Ihr Home-Verzeichnis kopieren:
Wenn Sie ein anderes System verwenden, erstellen Sie die Datei mit folgendem Befehl:
Jetzt, da Sie die Dateien haben, können Sie mit grep
arbeiten.
In der einfachsten Form verwenden Sie grep
, um wörtliche Muster innerhalb einer Textdatei abzugleichen. Das bedeutet, dass wenn Sie grep
ein Wort zum Suchen übergeben, es jede Zeile in der Datei ausdrucken wird, die dieses Wort enthält.
Führen Sie den folgenden Befehl aus, um grep
zu verwenden und nach jeder Zeile zu suchen, die das Wort GNU
enthält:
Das erste Argument, GNU
, ist das Muster, nach dem Sie suchen, während das zweite Argument, GPL-3
, die Eingabedatei ist, die Sie durchsuchen möchten.
Die resultierende Ausgabe wird jede Zeile enthalten, die den Muster-Text enthält:
Output GNU GENERAL PUBLIC LICENSE
The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
Developers that use the GNU GPL protect your rights with two steps:
"This License" refers to version 3 of the GNU General Public License.
13. Use with the GNU Affero General Public License.
under version 3 of the GNU Affero General Public License into a single
...
...
Auf einigen Systemen wird das gesuchte Muster in der Ausgabe hervorgehoben.
Gemeinsame Optionen
Standardmäßig sucht grep
nach dem exakt angegebenen Muster in der Eingabedatei und gibt die gefundenen Zeilen zurück. Sie können dieses Verhalten jedoch nützlicher machen, indem Sie einige optionale Flags zu grep
hinzufügen.
Wenn Sie möchten, dass grep
die „Groß- und Kleinschreibung“ Ihres Suchparameters ignoriert und nach Variationen in Groß- und Kleinschreibung sucht, können Sie die Option -i
oder --ignore-case
angeben.
Suchen Sie in derselben Datei wie zuvor mit folgendem Befehl nach jeder Instanz des Wortes license
(mit Groß-, Klein- oder gemischter Schreibung):
Die Ergebnisse enthalten: LICENSE
, license
und License
:
Output GNU GENERAL PUBLIC LICENSE
of this license document, but changing it is not allowed.
The GNU General Public License is a free, copyleft license for
The licenses for most software and other practical works are designed
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price. Our General Public Licenses are designed to make sure that you
(1) assert copyright on the software, and (2) offer you this License
"This License" refers to version 3 of the GNU General Public License.
"The Program" refers to any copyrightable work licensed under this
...
...
Wenn es eine Instanz mit LiCeNsE
gäbe, wäre diese ebenfalls zurückgegeben worden.
Wenn Sie alle Zeilen finden möchten, die nicht ein bestimmtes Muster enthalten, können Sie die Option -v
oder --invert-match
verwenden.
Suchen Sie nach jeder Zeile, die das Wort the
nicht im BSD-Lizenztext enthält, mit dem folgenden Befehl:
Sie erhalten diese Ausgabe:
OutputAll rights reserved.
Redistribution and use in source and binary forms, with or without
are met:
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...
Weil Sie die Option „Groß-/Kleinschreibung ignorieren“ nicht angegeben haben, wurden die letzten beiden Elemente als ohne das Wort the
zurückgegeben.
Es ist oft nützlich zu wissen, auf welcher Zeilennummer die Übereinstimmungen auftreten. Dies können Sie durch Verwendung der Option -n
oder --line-number
erreichen. Führen Sie das vorherige Beispiel mit dieser Flagge erneut aus:
Dies gibt den folgenden Text zurück:
Output2:All rights reserved.
3:
4:Redistribution and use in source and binary forms, with or without
6:are met:
13: may be used to endorse or promote products derived from this software
14: without specific prior written permission.
15:
16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...
Jetzt können Sie die Zeilennummer referenzieren, wenn Sie Änderungen an jeder Zeile vornehmen möchten, die the
nicht enthält. Dies ist besonders praktisch beim Arbeiten mit Quellcode.
Reguläre Ausdrücke
In der Einleitung haben Sie gelernt, dass grep
für „global regular expression print“ steht. Ein „regulärer Ausdruck“ ist eine Textzeichenfolge, die ein bestimmtes Suchmuster beschreibt.
Verschiedene Anwendungen und Programmiersprachen implementieren reguläre Ausdrücke leicht unterschiedlich. In diesem Tutorial werden Sie nur einen kleinen Teil der Art und Weise erkunden, wie grep
seine Muster beschreibt.
Wörtliche Übereinstimmungen
In den vorherigen Beispielen in diesem Tutorial, als Sie nach den Wörtern GNU
und the
gesucht haben, haben Sie tatsächlich nach einfachen regulären Ausdrücken gesucht, die genau die Zeichenfolge GNU
und the
entsprechen. Muster, die genau die zu suchenden Zeichen angeben, werden „wörtlich“ genannt, weil sie das Muster buchstäblich, Zeichen für Zeichen, entsprechen.
Es ist hilfreich, sich diese als Übereinstimmung einer Zeichenfolge von Zeichen vorzustellen, anstatt eines Wortes. Diese Unterscheidung wird wichtiger, wenn Sie komplexere Muster lernen.
Alle alphabetischen und numerischen Zeichen (sowie bestimmte andere Zeichen) werden buchstäblich übereinstimmend, es sei denn, sie werden durch andere Ausdrucksmechanismen modifiziert.
Verankerungsübereinstimmungen
Verankerungen sind spezielle Zeichen, die angeben, wo in der Zeile eine Übereinstimmung gültig sein muss.
Zum Beispiel können Sie mithilfe von Verankerungen angeben, dass Sie nur die Zeilen wissen möchten, die GNU
ganz am Anfang der Zeile entsprechen. Um dies zu tun, könnten Sie das ^
-Zeichen vor der wörtlichen Zeichenfolge verwenden.
Führen Sie den folgenden Befehl aus, um die GPL-3
-Datei zu durchsuchen und Zeilen zu finden, in denen GNU
am Anfang einer Zeile steht:
Dieser Befehl gibt die folgenden zwei Zeilen zurück:
OutputGNU General Public License for most of our software; it applies also to
GNU General Public License, you may choose any version ever published
Ähnlich verwenden Sie das Ankerzeichen $
am Ende eines Musters, um anzugeben, dass die Übereinstimmung nur gültig ist, wenn sie am Ende einer Zeile auftritt.
Dieser Befehl entspricht jeder Zeile, die mit dem Wort and
in der GPL-3
-Datei endet:
Sie erhalten diese Ausgabe:
Outputthat there is no warranty for this free software. For both users' and
The precise terms and conditions for copying, distribution and
License. Each licensee is addressed as "you". "Licensees" and
receive it, in any medium, provided that you conspicuously and
alternative is allowed only occasionally and noncommercially, and
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
provisionally, unless and until the copyright holder explicitly and
receives a license from the original licensors, to run, modify and
make, use, sell, offer for sale, import and otherwise run, modify and
Übereinstimmung mit jedem Zeichen
Das Punktzeichen (.) wird in regulären Ausdrücken verwendet, um anzuzeigen, dass an der angegebenen Stelle jedes einzelne Zeichen existieren kann.
Zum Beispiel, um alles in der GPL-3
-Datei zu finden, was zwei Zeichen hat und dann die Zeichenfolge cept
, verwenden Sie das folgende Muster:
Dieser Befehl liefert die folgende Ausgabe:
Outputuse, which is precisely where it is most unacceptable. Therefore, we
infringement under applicable copyright law, except executing it on a
tells the user that there is no warranty for the work (except to the
License by making exceptions from one or more of its conditions.
form of a separately written license, or stated as exceptions;
You may not propagate or modify a covered work except as expressly
9. Acceptance Not Required for Having Copies.
...
...
Diese Ausgabe enthält Instanzen von sowohl accept
als auch except
und Variationen der beiden Wörter. Das Muster würde auch z2cept
entsprechen, wenn es ebenfalls gefunden würde.
Klammerausdrücke
Durch Platzierung einer Gruppe von Zeichen innerhalb von Klammern (\[
und \]
) können Sie angeben, dass das Zeichen an dieser Position eines aus der Klammerngruppe sein kann.
Zum Beispiel, um die Zeilen zu finden, die too
oder two
enthalten, würden Sie diese Varianten prägnant durch folgendes Muster angeben:
Die Ausgabe zeigt, dass beide Varianten in der Datei existieren:
Outputyour programs, too.
freedoms that you received. You must make sure that they, too, receive
Developers that use the GNU GPL protect your rights with two steps:
a computer network, with no transfer of a copy, is not conveying.
System Libraries, or general-purpose tools or generally available free
Corresponding Source from a network server at no charge.
...
...
Klammernotation bietet Ihnen einige interessante Optionen. Sie können das Muster so einstellen, dass es alles außer den Zeichen innerhalb einer Klammer abgleicht, indem Sie die Liste der Zeichen innerhalb der Klammern mit einem ^
-Zeichen beginnen.
Dieses Beispiel ist wie das Muster .ode
, passt jedoch nicht zum Muster code
:
Hier ist die Ausgabe, die Sie erhalten werden:
Output 1. Source Code.
model, to give anyone who possesses the object code either (1) a
the only significant mode of use of the product.
notice like this when it starts in an interactive mode:
Bemerkenswert ist, dass in der zweiten zurückgegebenen Zeile tatsächlich das Wort code
vorhanden ist. Dies ist kein Versagen des regulären Ausdrucks oder von grep. Diese Zeile wurde vielmehr zurückgegeben, weil früher in der Zeile das Muster mode
, gefunden im Wort model
, gefunden wurde. Die Zeile wurde zurückgegeben, weil es eine Instanz gab, die zum Muster passte.
Ein weiteres nützliches Feature von Klammern ist, dass Sie einen Bereich von Zeichen anstelle des einzelnen Eingebens jedes verfügbaren Zeichens angeben können.
Dies bedeutet, dass Sie, wenn Sie jede Zeile finden möchten, die mit einem Großbuchstaben beginnt, das folgende Muster verwenden können:
Hier ist die Ausgabe, die dieser Ausdruck zurückgibt:
OutputGNU General Public License for most of our software; it applies also to
States should not allow patents to restrict development and use of
License. Each licensee is addressed as "you". "Licensees" and
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
System Libraries, or general-purpose tools or generally available free
Source.
User Product is transferred to the recipient in perpetuity or for a
...
...
Aufgrund einiger Legacy-Sortierprobleme ist es oft genauer, POSIX-Zeichenklassen anstelle von Zeichenbereichen zu verwenden, wie Sie sie gerade verwendet haben.
Um jede POSIX-Zeichenklasse zu diskutieren, würde über den Rahmen dieses Leitfadens hinausgehen, aber ein Beispiel, das das gleiche Verfahren wie das vorherige Beispiel erreichen würde, verwendet die Zeichenklasse \[:upper:\]
innerhalb eines Klammernselectors:
Die Ausgabe wird dieselbe sein wie zuvor.
Muster wiederholen null oder mehr Mal
Zuletzt gehört einer der am häufigsten verwendeten Meta-Zeichen der Asterisk oder *
, was bedeutet „wiederhole das vorherige Zeichen oder den vorherigen Ausdruck null oder mehr Mal“.
Um jede Zeile in der Datei GPL-3
zu finden, die eine öffnende und schließende Klammer enthält, nur Buchstaben und einzelne Leerzeichen dazwischen, verwenden Sie den folgenden Ausdruck:
Sie erhalten die folgende Ausgabe:
Output Copyright (C) 2007 Free Software Foundation, Inc.
distribution (with or without modification), making available to the
than the work as a whole, that (a) is included in the normal form of
Component, and (b) serves only to enable use of the work with that
(if any) on which the executable work runs, or a compiler used to
(including a physical distribution medium), accompanied by the
(including a physical distribution medium), accompanied by a
place (gratis or for a charge), and offer equivalent access to the
...
...
Bisher haben Sie Punkte, Asterisken und andere Zeichen in Ihren Ausdrücken verwendet, aber manchmal müssen Sie speziell nach diesen Zeichen suchen.
Escapen von Meta-Zeichen
Es gibt Zeiten, in denen Sie nach einem buchstäblichen Punkt oder einer buchstäblichen öffnenden Klammer suchen müssen, insbesondere bei der Arbeit mit Quellcode oder Konfigurationsdateien. Da diese Zeichen in regulären Ausdrücken eine besondere Bedeutung haben, müssen Sie diese Zeichen „escapen“, um grep
mitzuteilen, dass Sie in diesem Fall ihre besondere Bedeutung nicht verwenden möchten.
Sie escapen Zeichen, indem Sie das Backslash-Zeichen (\
) vor dem Zeichen verwenden, das normalerweise eine besondere Bedeutung hätte.
Zum Beispiel, um eine Zeile zu finden, die mit einem Großbuchstaben beginnt und mit einem Punkt endet, verwenden Sie den folgenden Ausdruck, der den Endpunkt escapet, damit er einen buchstäblichen Punkt darstellt anstatt die übliche Bedeutung von „beliebiges Zeichen“:
Dies ist die Ausgabe, die Sie sehen werden:
OutputSource.
License by making exceptions from one or more of its conditions.
License would be to refrain entirely from conveying the Program.
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
SUCH DAMAGES.
Also add information on how to contact you by electronic and paper mail.
Jetzt werfen wir einen Blick auf andere Optionen für reguläre Ausdrücke.
Erweiterte reguläre Ausdrücke
Der Befehl grep
unterstützt eine umfangreichere reguläre Ausdruckssprache durch Verwendung des -E
-Flags oder durch Aufrufen des Befehls egrep
anstelle von grep
.
Diese Optionen erweitern die Möglichkeiten der „erweiterten regulären Ausdrücke“. Erweiterte reguläre Ausdrücke umfassen alle grundlegenden Metazeichen sowie zusätzliche Metazeichen, um komplexere Übereinstimmungen auszudrücken.
Gruppierung
Eine der nützlichsten Fähigkeiten, die erweiterte reguläre Ausdrücke eröffnen, ist die Möglichkeit, Ausdrücke zusammenzufassen, um sie als eine Einheit zu manipulieren oder zu referenzieren.
Um Ausdrücke zusammenzufassen, umgeben Sie sie mit Klammern. Wenn Sie Klammern verwenden möchten, ohne erweiterte reguläre Ausdrücke zu verwenden, können Sie sie mit dem Backslash escapen, um diese Funktionalität zu aktivieren. Das bedeutet, dass die folgenden drei Ausdrücke funktional äquivalent sind:
Alternation
Ähnlich wie Bracket-Ausdrücke verschiedene mögliche Optionen für einzelne Zeichenübereinstimmungen angeben können, ermöglicht Alternation Ihnen, alternative Übereinstimmungen für Zeichenfolgen oder Ausdrucksgruppen anzugeben.
Um Alternation anzuzeigen, verwenden Sie das Pipe-Zeichen |
. Diese werden oft innerhalb von Klammern gruppiert verwendet, um anzugeben, dass eine von zwei oder mehr Möglichkeiten als Übereinstimmung betrachtet werden soll.
Das Folgende findet entweder GPL
oder General Public License
im Text:
Die Ausgabe sieht so aus:
Output The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price. Our General Public Licenses are designed to make sure that you
Developers that use the GNU GPL protect your rights with two steps:
For the developers' and authors' protection, the GPL clearly explains
authors' sake, the GPL requires that modified versions be marked as
have designed this version of the GPL to prohibit the practice for those
...
...
Alternation kann zwischen mehr als zwei Optionen wählen, indem zusätzliche Optionen innerhalb der Auswahlgruppe durch zusätzliche Pipe (|
)-Zeichen getrennt werden.
Quantifizierer
Wie das Meta-Zeichen *
, das das vorherige Zeichen oder Zeichenmenge null oder mehrmals übereinstimmte, gibt es auch andere Meta-Zeichen in erweiterten regulären Ausdrücken, die die Anzahl der Vorkommen angeben.
Um ein Zeichen null oder einmal zu entsprechen, können Sie das Zeichen ?
verwenden. Dies macht das vorherige Zeichen oder Zeichenmenge optional, im Wesentlichen.
Das Folgende passt zu copyright
und right
, indem copy
in eine optionale Gruppe gesetzt wird:
Sie erhalten diese Ausgabe:
Output Copyright (C) 2007 Free Software Foundation, Inc.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
"Copyright" also means copyright-like laws that apply to other kinds of
...
Das Zeichen +
entspricht einem Ausdruck ein oder mehrmals. Dies ist fast wie das Meta-Zeichen *
, aber mit dem Zeichen +
muss der Ausdruck mindestens einmal übereinstimmen.Die folgende Zeichenfolge passt zur Zeichenfolge free
plus ein oder mehrere Zeichen, die keine Leerzeichen sind:
Sie werden diese Ausgabe sehen:
Output The GNU General Public License is a free, copyleft license for
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
When we speak of free software, we are referring to freedom, not
have the freedom to distribute copies of free software (and charge for
you modify it: responsibilities to respect the freedom of others.
freedomss that you received. You must make sure that they, too, receive
protecting users' freedom to change the software. The systematic
of the GPL, as needed to protect the freedom of users.
patents cannot be used to render the program non-free.
Angabe der Übereinstimmungswiederholung
Um die Anzahl der Wiederholungen eines Treffers anzugeben, verwenden Sie die geschweiften Klammern ({
und }
). Mit diesen Zeichen können Sie eine genaue Anzahl, einen Bereich oder eine obere bzw. untere Grenze für die Anzahl der Treffer eines Ausdrucks festlegen.
Verwenden Sie den folgenden Ausdruck, um alle Zeilen in der Datei GPL-3
zu finden, die dreifache Vokale enthalten:
Jede zurückgegebene Zeile enthält ein Wort mit drei Vokalen:
Outputchanged, so that their problems will not be attributed erroneously to
authors of previous versions.
receive it, in any medium, provided that you conspicuously and
give under the previous paragraph, plus a right to possession of the
covered work so as to satisfy simultaneously your obligations under this
Um Wörter mit einer Länge zwischen 16 und 20 Zeichen abzugleichen, verwenden Sie den folgenden Ausdruck:
Hier ist die Ausgabe dieses Befehls:
Output certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
c) Prohibiting misrepresentation of the origin of that material, or
Nur Zeilen, die Wörter dieser Länge enthalten, werden angezeigt.
Fazit
grep
ist nützlich, um Muster innerhalb von Dateien oder der Dateisystemhierarchie zu finden, daher lohnt es sich, Zeit damit zu verbringen, sich mit den Optionen und der Syntax vertraut zu machen.
Reguläre Ausdrücke sind noch vielseitiger und können mit vielen gängigen Programmen verwendet werden. Zum Beispiel implementieren viele Texteditoren reguläre Ausdrücke zum Suchen und Ersetzen von Text.
Darüber hinaus verwenden die meisten modernen Programmiersprachen reguläre Ausdrücke, um Verfahren an bestimmten Datenstücken durchzuführen. Sobald Sie reguläre Ausdrücke verstehen, können Sie dieses Wissen auf viele gängige computerbezogene Aufgaben übertragen, angefangen bei der Durchführung fortgeschrittener Suchvorgänge in Ihrem Texteditor bis hin zur Validierung von Benutzereingaben.