Zum Inhalt springen

Grep: Unterschied zwischen den Versionen

Aus Foxwiki
Die 5 zuletzt angesehenen Seiten:  man » man » dd » pwd » grep
Saidmustafavi (Diskussion | Beiträge)
K Textersetzung - „http://“ durch „https://“
 
(73 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=Bedeutung=
'''grep''' - Suchen in Dateien und Datenstömen
<br>
<code>grep</code> steht für '''G'''lobal ''''R'''egular '''E'''xpression '''P'''rint.
Das heisst, dass du auch Regular Expressions für die Suche nutzen kannst. Wenn du noch nicht weisst, was Regular Expressions sind, solltest du dir ein Regex-Tutorial anschauen. Empfehlenswert ist zum Beispiel das interaktive von regexone.com. Ohne Regexes ist grep aber natürlich auch nutzbar.<br>


=Installation=
== Beschreibung ==
Mit grep lassen sich Zeichenketten in Dateien finden, die auf die angegebenen ''regular expressions'' passen
* Wird keine Datei angegeben, so wird die Standardeingabe verwendet
''grep'' steht für Global Regular Expression Print
* [[Regular Expressions]] für eine Suche nutzen


Das Programm grep ist im essentiellen Paket
== Installation ==
''grep'' ist ein [[essenzielles Paket]] und [[sollte]] auf jedem [[Linux]] installiert sein
<syntaxhighlight lang="bash" highlight="1" line>
sudo apt install grep
</syntaxhighlight>


  # apt install grep
== Aufruf ==
<syntaxhighlight lang="bash" highlight="1-2" line>
grep [Optionen] Muster [Datei...]
grep [Optionen] [-e Muster | -f Datei] [Datei...]
</syntaxhighlight>


von Linux enthalten und ist deshalb auf jedem System installiert.
=== Einsatz als Filter ===
Die Eingabe kann über die [https://eaumleitung.htm/ Standardeingabe] oder die Angabe von Dateien erfolgen
cat /etc/services | grep MySQL


=Aufruf von grep=
=== GNU Grep ===
GNU Grep unterstützt
{| class="wikitable options gnu sortable"
! UNIX !! GNU !! Ausdruck !! Befehl
|-
| -G || --basic-regexp || [[BRE]] || [[grep]]
|-
| -E || --extended-regexp || [[ERE]] || [[egrep]]
|-
| -F || --fixed-strings || [[fixed-string]] || [[fgrep]]
|-
| -P || --perl-regexp || PCRE ||
|-
| -r || || || rgrep
|}


 
=== Optionen ===
grep [Optionen] [-e Muster | -f Datei] [Datei...]
; Wichtige Optionen
 
{| class="wikitable sortable options gnu"
außerdem gibt es noch drei Varianten von grep:
|-
 
! Unix !! GNU !! Parameter !! Beschreibung
egrep entspricht grep -E (obige Beschreibung von regular expressions bezog sich auf diese Variante)
|-
 
| -A || --after-context= || NUM || gibt zusätzlich NUM Zeilen nach der passenden Zeile aus
fgrep entspricht grep -F
|-
 
| -a || --text || || Verarbeite eine binäre Datei, als wäre sie Text. Dies entspricht der Option --binary-files=text
rgrep entspricht grep -r
|-
 
| -B  || --before-context= || NUM || gibt zusätzlich NUM Zeilen vor der passenden Zeile aus
=Einsatzgebiete=
|-
 
| -b || --byte-offset || || gibt den Byte-Offset innerhalb der Datei vor jeder gefundenen Zeile an
grep wird in erster Linie dann eingesetzt, wenn Dateien durchsucht werden müssen, zum Beispiel die Quelldateien eines Computerprogramms oder Logdateien. In Zusammenarbeit mit find kann ein ganzer Dateibaum gelesen werden.
|-
 
| -c || --binary-files= || TYP|| gibt an, wie mit [[#Binärdateien|Binärdateien]] verfahren soll
 
|-
 
| -C || --count || || unterdrückt die normale Ausgabe und gibt stattdessen für jede Eingabedatei an, wieviele Zeilen auf die regular expression passen
<code>$ find /home/benutzername -exec grep -H "Passwort" {} \;</code>
|-
 
| || --colour <br>--color || [=Wann] || Markiert Treffer farbig. Wann kann dabei "never", "always" oder "auto" sein
 
|-
Dieses Kommando durchsucht alle Dateien des Quellverzeichnisses des Benutzers benutzername nach der Zeichenkette Passwort und zeigt die gefundenen Zeilen zusammen mit dem Dateinamen an, wobei die Anzeige des Dateinamens durch die Option -H ausgelöst wird.
| -E || --extended-regexp || ||Verwendet die extended Variante beim Interpretieren der übergebenen regular expression
 
|-
 
| -e || --regexp= || Muster || verwende Muster als regular expression. Nützlich um Ausdrücke zu schützen, die mit einem - beginnen
Manche grep-Versionen ermöglichen eine kürzere Formulierung mit Hilfe der Option -r:<br>
|-
 
| -F || --fixed-strings || || interpretiert das übergebene Muster als eine Liste von festen Zeichenketten, die durch Zeilenumbrüche voneinander getrennt sind
 
|-
<code>$ grep -r "Passwort" /home/benutzername</code>
| -f ||--file= || Datei|| beziehe die Muster aus Datei, eines je Zeile. Eine leere Datei enthält keine Muster und passt somit auf keinen String
 
|-
 
| -H || --with-filename || || gibt den Dateinamen vor jedem Treffer aus
Ein zweites Einsatzgebiet ist die Verwendung als Zeilen-Filter innerhalb einer Kette von Befehlen, z. B.:<br>
|-
 
| -h || --no-filename || ||unterdrückt die Ausgabe des Dateinamens, wenn mehrere Dateien durchsucht werden
 
|-
<code>$ tail -1000 /var/log/mail | grep "Mailadresse"</code><br>
| -I || --binary-files= || without-match|| schließt Binärdateien aus
 
==Parameter==
 
Diese Parameterliste ist unvollständig. Weiteres findet sich auf der man-Seite von grep
{| class="wikitable"
|-
|-
! Kurzform !! Langform !! Beschreibung
| -i || --ignore-case || || unterscheide nicht zwischen Groß- und Kleinschreibung
|-
|-
| -A NUM || --after-context=NUM || gibt zusätzlich NUM Zeilen nach der passenden Zeile aus.
| -L || --files-without-match || || unterdrückt die normale Ausgabe und gibt stattdessen die Dateinamen von allen Dateien, die keine Treffer enthalten aus. Die Bearbeitung stoppt, sobald ein Treffer auftritt
|-
|-
| -a text || --text || Verarbeite eine binäre Datei, als wäre sie Text. Dies entspricht der Option --binary-files=text.
| -l || --files-with-match || || unterdrückt die normale Ausgabe und gibt stattdessen die Dateinamen von allen Dateien, die Treffer enthalten aus. Die Bearbeitung stoppt, sobald ein Treffer auftritt
|-
|-
| -B NUM || --before-context=NUM Beispiel || gibt zusätzlich NUM Zeilen vor der passenden Zeile aus.
| -n ||--line-number || || gibt die Zeilennummer vor jedem Treffer aus
|-
| -b || --byte-offset || gibt den Byte-Offset innerhalb der Datei vor jeder gefundenen Zeile an.
|-
| ||--binary-files=TYP  || gibt an, wie grep mit binären Dateien verfahren soll. Default für Typ ist binary, in diesem Fall gibt grep nur eine kurze einzeilige Mitteilung aus, ob die Datei das Muster enthält oder nicht. without-match nimmt an, dass eine binäre Datei keine passenden Zeichenketten enthält. Bei text verarbeitet grep die Datei als wäre sie eine Textdatei. Vorsicht: Die Ausgabe von binären Daten kann zu unerwünschten Resultaten führen, wenn die Ausgabe auf einem Terminal erfolgt, und dieses einige der Zeichenketten als Befehle interpretiert!
|-
| -C NUM || --count || unterdrückt die normale Ausgabe und gibt stattdessen für jede Eingabedatei an, wieviele Zeilen auf die regular expression passen.
|-
| || --colour[=Wann], --color[=Wann] || Markiert Treffer farbig. Wann kann dabei "never", "always" oder "auto" sein.
|-
|-E || --extended-regexp || Verwendet die extended Variante beim Interpretieren der übergebenen regular expression
|-
|-e Muster || --regexp=Muster || verwende Muster als regular expression. Nützlich um Ausdrücke zu schützen, die mit einem - beginnen.
|-
| -F|| --fixed-strings || interpretiert das übergebene Muster als eine Liste von festen Zeichenketten, die durch Zeilenumbrüche voneinander getrennt sind.
|-
|-f Datei || --fixed-strings || interpretiert das übergebene Muster als eine Liste von festen Zeichenketten, die durch Zeilenumbrüche voneinander getrennt sind.
|-
| -f Datei||--file=Datei  || beziehe die Muster aus Datei, eines je Zeile. Eine leere Datei enthält keine Muster und passt somit auf keinen String.
|-
| -H ||  --with-filename  || gibt den Dateinamen vor jedem Treffer aus
|-
|-h  || --no-filename || unterdrückt die Ausgabe des Dateinamens, wenn mehrere Dateien durchsucht werden.
|-
| -I||  --binary-files=without-match|| schließt Binärdateien aus.
|-
| -i|| --ignore-case || unterscheide nicht zwischen Groß- und Kleinschreibung.
|-
| -L|| --files-without-match || unterdrückt die normale Ausgabe und gibt stattdessen die Dateinamen von allen Dateien, die keine Treffer enthalten aus. Die Bearbeitung stoppt, sobald ein Treffer auftritt.
|-
| -l|| --files-with-match || unterdrückt die normale Ausgabe und gibt stattdessen die Dateinamen von allen Dateien, die Treffer enthalten aus. Die Bearbeitung stoppt, sobald ein Treffer auftritt.
|-
| -n||--line-number || gibt die Zeilennummer vor jedem Treffer aus.
|-
|-o || --only-matching || gibt nur die passende Zeichenkette aus.
|-
|-P ||  --perl-regexp|| verwendet Perl regular expressions
|-
|-
|-q ||--quiet, --silent  || schreibt nichts auf die Standardausgabe und stoppt beim ersten Treffer.
| -o || --only-matching || || gibt nur die passende Zeichenkette aus
|-
|-
|-R -r || --recursive || liest alle Dateien unter jedem Verzeichnis rekursiv.
| -P || --perl-regexp || || verwendet Perl regular expressions
|-
|-
| -v || --invert-match || Invertiert die Suche und liefert alle Zeilen die nicht auf das gesuchte Muster passen.
| -q || --quiet <br>--silent || || schreibt nichts auf die Standardausgabe und stoppt beim ersten Treffer
|-
|-w || --word-regexp || wählt nur solche Zeilen aus, deren Treffer aus vollständigen Wörtern bestehen.
|-
|}
 
=Regular Expressions=
 
==Listen (bracket expressions)==
Erwartet man an einer Stelle innerhalb des Regulären Ausdrucks nicht ein ganz bestimmtes Zeichen, sondern nur eines aus einer spezifischen Liste, so kann man dies durch eine sogenannte bracket expression ausdrücken. Die Liste der Zeichen, aus der das zu findende Zeichen stammen soll, wird dazu einfach in eckigen Klammern "[]" angegeben. Um beispielsweise alle Buchstaben "a", egal ob groß oder klein, zu finden, verwendet man folgenden regulären Ausdruck: "[Aa]" Möchte man alle Zeichen finden, die nicht in der Liste stehen, die Liste also negieren, so muss das erste Zeichen in der Liste ein Caret "^" sein. Ein regulärer Ausdruck der Form "[^Aa]" passt also auf alle Zeichen, die weder ein großes "A" noch ein kleines "a" sind.
 
Kurzes Beispiel: "[Aa]lpha" findet alle Textstücke "Alpha" und "alpha".
 
Um die Listen der bracket extensions kompakt darstellen zu können, werden range expressions verwendet. Ein range expression wird durch zwei Zeichen, die durch einen Bindestrich miteinander verbunden sind, dargestellt: "[a-d]". Ein solcher Ausdruck passt auf alle Zeichen, die in der Sortierung des Zeichensatzes zwischen die beiden Zeichen fallen. Leider hängt diese Sortierung von der verwendeten locale-Einstellung ab. In der Standard C locale würde obiges Muster "[a-d]" einem regulären Ausdruck von "[abcd]" entsprechen, während er bei vielen anderen locales einem Ausdruck "[aBbCcDd]" entsprechen würde. Um die C locale für die Zeichensortierung zu erzwingen, kann man der Variablen LC_CTYPE den Wert C zuweisen:
 
{| class="wikitable"
|-
|-
| LC_CTYPE=C befehl || gilt nur für diesen Befehl
| -R <br>-r | || --recursive||
|liest alle Dateien unter jedem Verzeichnis rekursiv
|-
|-
|LC_CTYPE=C grep -E [a-d] Datei|| Beispiel
| -v || --invert-match || || Invertiert die Suche und liefert alle Zeilen die nicht auf das gesuchte Muster passen
|-
|-
| export LC_CTYPE=C || gilt für alle nachfolgenden Befehle
| -w || --word-regexp || |
|wählt nur solche Zeilen aus, deren Treffer aus vollständigen Wörtern bestehen
|}
|}


Die meisten Zeichen mit besonderer Bedeutung verlieren diese Bedeutung innerhalb eines bracket expressions. Um ein Zeichen "]" in die Liste aufzunehmen, muss es an der ersten Stelle in der Liste stehen. Um das Caret "^" in die Liste aufzunehmen, kann es irgendwo in der Liste stehen, nur nicht an der ersten Stelle. Um den Bindestrich "-" in die Liste einzufügen, muss es an letzter Stelle stehen.
=== Parameter ===
 
Darüber hinaus gibt es einige vordefinierte Listen:
   
* [:alnum:] alle Ziffern und Buchstaben
 
* [:alpha:] alle Buchstaben
 
* [:cntrl:] alle Kontrollzeichen
 
* [:digit:] alle Ziffern
 
*  [:lower:] alle Kleinbuchstaben
 
*  [:punct:] alle Satzzeichen
 
*  [:blank:] Leerzeichen
 
*  [:space:] Zeichen die Leerraum erzeugen (Leerzeichen, Zeilenvorschub, ...)
 
*  [:upper:] alle Großbuchstaben
 
==Besondere Zeichen==
 
Der Punkt "." passt auf ein beliebiges Zeichen.
 
Das Caret "^" findet den Anfang einer Zeile.
 
Das Dollarzeichen "$" findet das Ende einer Zeile.
 
Die Symbole "\<" passen auf den Beginn eines Wortes.
 
Die Symbole "\>" passen auf das Ende eines Wortes.
 
==Wiederholungsoperatoren==
 
Reguläre Ausdrücke können mit Hilfe dieser Operatoren öfter wiederholt werden.
 
    "?" Der vorangegangene Ausdruck ist Optional und wird maximal einmal angetroffen.
 
    "*" Der vorangegangene Ausdruck wird beliebig oft (auch keinmal) vorgefunden.
 
    "+" Der vorangegangene Ausdruck wird mindestens einmal gefunden.


    "{n}" Der vorangegangene Ausdruck wird genau n-mal gefunden.
=== Umgebungsvariablen ===


    "{n,}" Der vorangegangene Ausdruck wird mindestens n-mal oder öfter angetroffen.
=== Exit-Status ===


    "{n,m}" Der vorangegangene Ausdruck wird mindesten n-mal und maximal m-mal angetroffen.
== Konfiguration ==
=== Binärdateien ===
Wie soll grep mit binären Dateien verfahren?
* Default für Typ ist binary, in diesem Fall gibt grep nur eine kurze einzeilige Mitteilung aus, ob die Datei das Muster enthält oder nicht.
* without-match nimmt an, dass eine binäre Datei keine passenden Zeichenketten enthält.
* Bei text verarbeitet grep die Datei als wäre sie eine Textdatei.  


==Zusammenführung von regulären Ausdrücken==
; Vorsicht
<blockquote>
Die Ausgabe von binären Daten kann zu unerwünschten Resultaten führen, wenn die Ausgabe auf einem Terminal erfolgt, und dieses einige der Zeichenketten als Befehle interpretiert!
</blockquote>
<noinclude>


Mehrere reguläre Ausdrücke können durch Aneinanderfügen zusammengeführt werden. Ein solcher Ausdruck findet dann alle Zeichenketten, die aneinander gehängt zu dem jeweiligen Ausdruck passen. Das obige Beispiel "[Aa]lpha" stellt eine solche Verkettung dar. Es ist aus den Einzelnen Bausteinen "[Aa]", "l", "p", "h" und "a" aufgebaut.
== Anhang ==
=== Siehe auch ===
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}


===Verknüpfung durch "oder"===
=== Dokumentation ===
Durch den Operator "|" lassen sich reguläre Ausdrücke mit einem "oder" verknüpfen. Der daraus entstehende Ausdruck findet Zeichenketten, die entweder auf den einen oder den anderen Ausdruck passen.


Kurzes Beispiel: "[Aa]lpha|[Bb]ravo" findet alle Textstücke "Alpha", "alpha", "Bravo" und "bravo" (am Besten nur mit Parameter -E oder egrep).
; Man-Page


===Vorrang der Regeln===
; Info-Pages
Ähnlich wie bei mathematischen Ausdrücken (Punkt- vor Strichrechnung) unterliegen die Verknüpfungsoperatoren einer gewissen Rangfolge: Wiederholungen kommen vor Verkettungen, die wiederum vor dem "oder" kommen. Wie auch in arithmetischen Ausdrücken lassen sich diese Regeln durch Klammern überschreiben.


===Geklammerte Ausdrücke referenzieren===
=== Links ===
Eine Teilzeichenkette, die auf einen geklammerten Teilausdruck gepasst hat, lässt sich durch "\n" referenzieren. Dabei steht "n" für eine einzelne Ziffer, die den n-ten geklammerten Teilausdruck auswählt.
==== Projekt ====


Beispiele:
==== Weblinks ====
* "\<[Aa]+n+[ae]+\>" findet alle Wörter, die ungefähr wie Anne oder Anna aussehen, nur mit beliebig vielen "A", "n" und "e" (sofern sie jeweils mindestens ein mal vorkommen). AAnnneeea würde zum Beispiel auch passen.
# https://wiki.ubuntuusers.de/grep/
*    "[Ss]up(er|ra)" findet alle Wörter, die ein Super, super, Supra oder supra enthalten.
*    "^[[:digit:]]" findet alle Zeilen, die mit einer Ziffer beginnen.


= Quellen =
[[Kategorie:Linux/Suchen]]
* Wiki-Ubuntuuseres : https://wiki.ubuntuusers.de/grep/
[[Kategorie:Linux/Befehl]]
[[Kategorie:Regular Expression]]


[[Category:Linux:Suchen]]
{{DEFAULTSORT:grep}}
{{DISPLAYTITLE:grep}}
</noinclude>

Aktuelle Version vom 7. April 2025, 14:36 Uhr

grep - Suchen in Dateien und Datenstömen

Beschreibung

Mit grep lassen sich Zeichenketten in Dateien finden, die auf die angegebenen regular expressions passen

  • Wird keine Datei angegeben, so wird die Standardeingabe verwendet

grep steht für Global Regular Expression Print

Installation

grep ist ein essenzielles Paket und sollte auf jedem Linux installiert sein

sudo apt install grep

Aufruf

grep [Optionen] Muster [Datei...]
grep [Optionen] [-e Muster | -f Datei] [Datei...]

Einsatz als Filter

Die Eingabe kann über die Standardeingabe oder die Angabe von Dateien erfolgen

cat /etc/services | grep MySQL

GNU Grep

GNU Grep unterstützt

UNIX GNU Ausdruck Befehl
-G --basic-regexp BRE grep
-E --extended-regexp ERE egrep
-F --fixed-strings fixed-string fgrep
-P --perl-regexp PCRE
-r rgrep

Optionen

Wichtige Optionen
Unix GNU Parameter Beschreibung
-A --after-context= NUM gibt zusätzlich NUM Zeilen nach der passenden Zeile aus
-a --text Verarbeite eine binäre Datei, als wäre sie Text. Dies entspricht der Option --binary-files=text
-B --before-context= NUM gibt zusätzlich NUM Zeilen vor der passenden Zeile aus
-b --byte-offset gibt den Byte-Offset innerhalb der Datei vor jeder gefundenen Zeile an
-c --binary-files= TYP gibt an, wie mit Binärdateien verfahren soll
-C --count unterdrückt die normale Ausgabe und gibt stattdessen für jede Eingabedatei an, wieviele Zeilen auf die regular expression passen
--colour
--color
[=Wann] Markiert Treffer farbig. Wann kann dabei "never", "always" oder "auto" sein
-E --extended-regexp Verwendet die extended Variante beim Interpretieren der übergebenen regular expression
-e --regexp= Muster verwende Muster als regular expression. Nützlich um Ausdrücke zu schützen, die mit einem - beginnen
-F --fixed-strings interpretiert das übergebene Muster als eine Liste von festen Zeichenketten, die durch Zeilenumbrüche voneinander getrennt sind
-f --file= Datei beziehe die Muster aus Datei, eines je Zeile. Eine leere Datei enthält keine Muster und passt somit auf keinen String
-H --with-filename gibt den Dateinamen vor jedem Treffer aus
-h --no-filename unterdrückt die Ausgabe des Dateinamens, wenn mehrere Dateien durchsucht werden
-I --binary-files= without-match schließt Binärdateien aus
-i --ignore-case unterscheide nicht zwischen Groß- und Kleinschreibung
-L --files-without-match unterdrückt die normale Ausgabe und gibt stattdessen die Dateinamen von allen Dateien, die keine Treffer enthalten aus. Die Bearbeitung stoppt, sobald ein Treffer auftritt
-l --files-with-match unterdrückt die normale Ausgabe und gibt stattdessen die Dateinamen von allen Dateien, die Treffer enthalten aus. Die Bearbeitung stoppt, sobald ein Treffer auftritt
-n --line-number gibt die Zeilennummer vor jedem Treffer aus
-o --only-matching gibt nur die passende Zeichenkette aus
-P --perl-regexp verwendet Perl regular expressions
-q --quiet
--silent
schreibt nichts auf die Standardausgabe und stoppt beim ersten Treffer
--recursive liest alle Dateien unter jedem Verzeichnis rekursiv
-v --invert-match Invertiert die Suche und liefert alle Zeilen die nicht auf das gesuchte Muster passen
-w --word-regexp wählt nur solche Zeilen aus, deren Treffer aus vollständigen Wörtern bestehen

Parameter

Umgebungsvariablen

Exit-Status

Konfiguration

Binärdateien

Wie soll grep mit binären Dateien verfahren?

  • Default für Typ ist binary, in diesem Fall gibt grep nur eine kurze einzeilige Mitteilung aus, ob die Datei das Muster enthält oder nicht.
  • without-match nimmt an, dass eine binäre Datei keine passenden Zeichenketten enthält.
  • Bei text verarbeitet grep die Datei als wäre sie eine Textdatei.
Vorsicht

Die Ausgabe von binären Daten kann zu unerwünschten Resultaten führen, wenn die Ausgabe auf einem Terminal erfolgt, und dieses einige der Zeichenketten als Befehle interpretiert!


Anhang

Siehe auch

Dokumentation

Man-Page
Info-Pages

Links

Projekt

Weblinks

  1. https://wiki.ubuntuusers.de/grep/