Zum Inhalt springen

Grep/Anwendung: Unterschied zwischen den Versionen

Aus Foxwiki
Die Seite wurde neu angelegt: „== Einsatzgebiete == 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 find /home/benutzername -exec grep -H "Passwort" {} \; Dieses Kommando durchsucht alle Dateien des Quellverzeichnisses des Benutzers benutzername nach der Zeichenkette Passwort und zeigt die gefundenen Zeilen zusam…“
 
K Textersetzung - „–“ durch „-“
 
(45 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
== Einsatzgebiete ==
'''Grep/Anwendung'''
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
 
== Beschreibung ==
Mit regular expression lassen sich Dateien nach bestimmten Textstücken durchsuchen
* Die Suchmuster werden ''regular expressions'' genannt
* Sie sind vielfältig einsetzbar und werden nicht nur von grep verwendet
 
Global search for a regular expression and print out matched lines
* kurz 'g/re/p' ist das gebräuchlichste Kommando, um in Dateien nach bestimmten Mustern zu suchen
 
=== Einsatzgebiete ===
Suche in Dateien durchsucht
 
In Zusammenarbeit mit find kann ein ganzer Dateibaum gelesen werden
  find /home/benutzername -exec grep -H "Passwort" {} \;
  find /home/benutzername -exec grep -H "Passwort" {} \;


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
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


Manche grep-Versionen ermöglichen eine kürzere Formulierung mit Hilfe der Option -r:
Manche grep-Versionen ermöglichen eine kürzere Formulierung mithilfe der Option -r
  grep -r "Passwort" /home/benutzername
  grep -r "Passwort" /home/benutzername


Ein zweites Einsatzgebiet ist die Verwendung als Zeilen-Filter innerhalb einer Kette von Befehlen, z. B. 
Ein zweites Einsatzgebiet ist die Verwendung als Zeilen-Filter innerhalb einer Kette von Befehlen, beispielsweise
  tail -1000 /var/log/mail | grep "Mailadresse"
  tail -1000 /var/log/mail | grep "Mailadresse"


grep schreibt alle Zeilen der Eingabe, die das gesuchte Muster enthalten, auf die Standardausgabe
grep schreibt alle Zeilen der Eingabe, die das gesuchte Muster enthalten, auf die Standardausgabe


== Einführung ==
== Arbeiten mit grep ==
Mit get regularexpression lassen sich Dateien nach bestimmten Textstücken durchsuchen. Die Suchmuster werden ''regular expressions'' genannt. Sie sind vielfältig einsetzbar, und werden nicht nur von grep verwendet
=== Einfache Wortsuche ===
grep root /etc/passwd


»Global search for a regular expression and print out matched lines«
Zeigt alle Zeilen, die root in genau dieser Schreibweise enthalten


kurz 'g/re/p' ist das gebräuchlichste Kommando, um in Dateien nach bestimmten Mustern zu suchen
=== Suche nach Wortvariationen ===
grep -i Root /etc/passwd


== Syntax ==
Ignoriert Groß-/Kleinschreibung
grep [Optionen] Muster [Datei...]


oder
  grep will[iy] /etc/passwd
  grep [Optionen] [-e Muster | -f Datei] [Datei...]


=== Einsatz als Filter ===
Findet Zeilen die willi und willy enthalten
Die Eingabe kann über die [http://eaumleitung.htm/ Standardeingabe] oder die Angabe von Dateien erfolgen
cat /etc/services | grep MySQL


=== GNU Grep unterstützt ===
grep will[^y] /etc/passwd
* <tt>-G --basic-regexp</tt>, (BRE)
* <tt>-E --extended-regexp</tt> (ERE)
* <tt>-F --fixed-strings</tt>
* <tt>-P --perl-regexp</tt>


In anderen Implementierungen entspricht das z.&nbsp;B.&nbsp;den drei Kommandos egrep, grep und fgrep (ohne PCRE)
Findet nicht willy nicht enthalten, aber willi, willo usw


=== grep vs egrep ===
=== Leere Zeilen entfernen ===
egrep is the same as grep -E. It interpret PATTERN as an extended regular expression
grep -v '^$' /etc/services


From the grep man page:
Wenn ein Zeilenende auf einen Zeilenanfang ^ folgt so werden leere Zeilen gefunden. -v invertiert die Ergebnisse und gibt Leerzeilen nicht aus
In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \)
Traditional egrep did not support the { meta-character, and some egrep implementations support \{ instead, so portable scripts should avoid { in grep -E patterns and should use [{] to match a literal {
GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification
For example, the command grep -E '{1' searches for the two-character string {1 instead of reporting a syntax error in the regular expression
POSIX.2 allows this behavior as an extension, but portable scripts should avoid it


==== egrep oder grep -E? ====
=== Kommentare filtern ===
Extended Grep (erweitertes grep) versteht andere Regulären Ausdrücke als »grep«
grep -v '^#' /etc/services


egrep ist wie grep, nur mit dem Unterschied, dass auch +, ?, | und () als Regular Expression genutzt werden können
Zeilen mit einem Kommentarzeichen # am Zeilenanfang ^ gelten in Shellskripten als Kommentare. -v invertiert die Ergebnisse und gibt Zeilen mit Kommentaren nicht aus


egrep ist nichts anderes als ein grep -E. Auf vielen Maschinen ist egrep sogar nur ein Link auf grep. Außerdem ist egrep veraltet, weswegen grep -E genutzt werden sollte
=== Anzahl der Treffer ermitteln ===
grep -c '^#' /etc/services


==== fgrep ====
Gibt die Anzahl der Kommentarzeilen in der Datei an
Fgrep kann immer anstelle von grep verwendet werden, falls das zu suchende Muster keine regulären Ausdrücke enthält


Alle Sonderzeichen in der Musterzeichenkette verlieren ihre Sonderbedeutung und werden als Bestandteil des Musters verstanden. Fgrep arbeitet dadurch etwas schneller als grep und ist vor allem beim Durchsuchen großer Datenmengen nützlich
=== Treffer im Zusammenhang sehen ===
grep -C2 NFS /etc/services


==== Effizientz ====
Zeigt Treffer mit den beiden Zeilen davor und danach
Grep arbeitet bei der Suche wesentlich effizienter als das in einem Editor geschehen würde


=== Parameterübersicht ===
=== In welcher Datei wird eine Variable gesetzt? ===
Mit <tt>grep</tt> lassen sich Zeichenketten in Dateien finden, die auf die angegebenen ''regular expressions'' passen. Wird keine Datei angegeben, so wird die Standardeingabe verwendet
Bei der Systemadministration fragt man sich häufig, in welcher Datei eigentlich welche Shell-Variable gesetzt wird? Die globalen Vorgaben erfolgen zum Großteil in den Dateien des Verzeichnisses /etc


Diese Parameterliste ist unvollständig. Weiteres findet sich auf der [http://wiki.ubuntuusers.de/man man]-Seite von grep
=== Namen der Dateien, in denen beispielsweise die PATH-Variable modifiziert wird ===
grep -l PATH /etc/* 2>/dev/null
/etc/csh.cshrc
/etc/login.defs
/etc/manpath.config
/etc/profile
/etc/profile.rpmsave
/etc/rc.config
/etc/squid.conf


{| class="wikitable sortable"
Eventuell ist die Umleitung der Fehlerausgabe (2>/dev/null) sinnvoll
|-
| | Kurzform
| | Langform
| | Beschreibung
|-
| | <tt>-A NUM </tt>
| | <tt>--after-context=NUM</tt>
| | gibt zusätzlich NUM Zeilen nach der passenden Zeile aus
|-
| | <tt>-a text </tt>
| | <tt>--text</tt>
| | Verarbeite eine binäre Datei, als wäre sie Text. Dies entspricht der Option <tt>--binary-files=text</tt>
|-
| | <tt>-B NUM </tt>
| | <tt>--before-context=NUM</tt>
| | gibt zusätzlich NUM Zeilen vor der passenden Zeile aus
|-
| | <tt>-b </tt>
| | <tt>--byte-offset</tt>
| | gibt den Byte-Offset innerhalb der Datei vor jeder gefundenen Zeile an
|-
| |
| | <tt>--binary-files=TYP</tt>
| | gibt an, wie grep mit binären Dateien verfahren soll. Default für Typ ist <tt>binary</tt>, in diesem Fall gibt <tt>grep</tt> nur eine kurze einzeilige Mitteilung aus, ob die Datei das Muster enthält oder nicht. <tt>without-match</tt> nimmt an, dass eine binäre Datei keine passenden Zeichenketten enthält


Bei <tt>text</tt> 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!''
=== Wie viele Benutzer sind Mitglied einer Gruppe? ===
|-
Wie viele Nutzer sind Mitglied in der default-Gruppe users (GID 100)?
| | <tt>-C NUM </tt>
| | <tt>--context=NUM</tt>
| | gibt zusätzlich NUM Zeilen von Kontext aus. Zwischen zusammenhängende Gruppen von Treffern werden Zeilen mit "--" eingefügt
|-
| | <tt>-c </tt>
| | <tt>--count</tt>
| | unterdrückt die normale Ausgbabe und gibt stattdessen für jede Eingabedatei an, wieviele Zeilen auf die regular expression passen
|-
| |
| | <tt>--colour[=Wann]</tt>, <tt>--color[=Wann]</tt>
| | Markiert Treffer farbig. <tt>Wann</tt> kann dabei "never", "always" oder "auto" sein
|-
| | <tt>-E </tt>
| | <tt>--extended-regexp</tt>
| | Verwendet die ''extended'' Variante beim Interpretieren der übergebenen ''regular expression''
|-
| | <tt>-e Muster </tt>
| | <tt>--regexp=Muster</tt>
| | verwende Muster als ''regular expression''. Nützlich um Ausdrücke zu schützen, die mit einem <tt>-</tt> beginnen
|-
| | <tt>-F </tt>
| | <tt>--fixed-strings</tt>
| | interpretiert das übergebene Muster als eine Liste von festen Zeichenketten, die durch Zeilenumbrüche voneinander getrennt sind
|-
| | <tt>-f Datei </tt>
| | <tt>--file=Datei</tt>
| | beziehe die Muster aus Datei, eines je Zeile. Eine leere Datei enthält keine Muster und passt somit auf keinen String
|-
| | <tt>-H </tt>
| | <tt>--with-filename</tt>
| | gibt den Dateinamen vor jedem Treffer aus
|-
| | <tt>-h </tt>
| | <tt>--no-filename</tt>
| | unterdrückt die Ausgabe des Dateinamens, wenn mehrere Dateien durchsucht werden
|-
| | <tt>-I </tt>
| | <tt>--binary-files=without-match</tt>
| | schließt Binärdateien aus
|-
| | <tt>-i </tt>
| | <tt>--ignore-case</tt>
| | unterscheide nicht zwischen Groß- und Kleinschreibung
|-
| | <tt>-L </tt>
| | <tt>--files-without-match</tt>
| | 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
|-
| | <tt>-l </tt>
| | <tt>--files-with-match</tt>
| | unterdrückt die normale Ausgabe und gibt stattdessen die Dateinamen von allen Dateien, die Treffer enthalten aus. Die Bearbeitung stoppt, sobald ein Treffer auftritt
|-
| | <tt>-n </tt>
| | <tt>--line-number</tt>
| | gibt die Zeilennummer vor jedem Treffer aus
|-
| | <tt>-o </tt>
| | <tt>--only-matching</tt>
| | gibt nur die passende Zeichenkette aus
|-
| | <tt>-P </tt>
| | <tt>--perl-regexp</tt>
| | verwendet ''Perl regular expressions''
|-
| | <tt>-q </tt>
| | <tt>--quiet</tt>, <tt>--silent</tt>
| | schreibt nichts auf die Standardausgabe und stoppt beim ersten Treffer
|-
| | <tt>-R</tt> <tt>-r</tt>
| | <tt>--recursive</tt>
| | liest alle Dateien unter jedem Verzeichnis rekursiv
|-
| | <tt>-v </tt>
| | <tt>--invert-match</tt>
| | Invertiert die Suche und liefert alle Zeilen die nicht auf das gesuchte Muster passen
|-
| | <tt>-w </tt>
| | <tt>--word-regexp</tt>
| | wählt nur solche Zeilen aus, deren Treffer aus vollständigen Wörtern bestehen


|-
grep -c ':[0-9]\{1,\}:100:' /etc/passwd
|}
9


=== Rückgabewerte ===
Bei der Angabe des Suchmusters hilft uns die Kenntnis des Aufbaus der Datei ''/etc/passwd''. * Dabei steht die GruppenID immer zwischen zwei Doppelpunkten
Zudem liefern die Kommandos der Grep-Familie einen Rückgabewert an das Betriebssystem, was sie für die Verwendung in Shellprogrammen prädestiniert
* Allerdings könnte es sein, dass auch die NutzerID (UID) 100 vergeben ist - der Ausdruck :[0-9]\{1,\}:100: garantiert, dass :100: das zweite rein numerische Feld betrifft


Häufig interessiert man sich nicht für den exakten Inhalt der Zeile, die das Muster enthält, sondern einzig ob das Muster überhaupt existiert
Eine andere Schreibweise wäre:


Vor allem in Shellskripten wird man die Ausgaben der Kommandos unterdrücken und anschließend anhand des Rückgabewertes den weiteren Programmablauf steuern
grep -c ':[[:digit:]]\{1,\}:100:' /etc/passwd
9


Rückgabewert 0
=== Netzwerkdienste über UDP ===
Welche Netzwerkdienste über UDP sind auf unserem System verfügbar (Datei /etc/inetd.conf)?


Muster wurde gefunden
grep '^[^#].*[[:space:]]udp' /etc/inetd.conf
time dgram udp wait root internal
talk dgram udp wait root /usr/sbin/tcpd in.talkd
ntalk dgram udp wait root /usr/sbin/tcpd in.talkd
netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd * Jede Zeile, die mit einem # beginnt, ist ein Kommentar


# "root" sollte es in jeder "passwd" geben
* Also filtern wir solche Zeilen aus (^[^#])
grep root /etc/passwd >& /dev/null
* Das gesuchte Protokoll ist "udp"
echo?
* Vor diesem Schlüsselwort können beliebig viele Zeichen (.*) gefolgt von einem Leerzeichen oder Tabulator ([[:space:]]) stehen
0


Rückgabewert 1
=== Einfacher mit Pipe ===
Je gezielter man nach Informationen fahndet, desto verwirrender wird die Angabe der Suchmusters


Muster wurde nicht gefunden
In zahlreichen Fällen wird die Verwendung von [https://eaumleitung.htm/#pipes Pipes] einleuchtender sein


# "ROOT" gibt es hoffentlich nicht
Das Ergebnis aus obigen Beispiel erhält man auch mit folgender Befehlsfolge:
grep ROOT /etc/passwd >& /dev/null
echo?
1


Rückgabewert 2
grep -w udp /etc/inetd.conf | grep -v ^#
 
time dgram udp wait root internal
Datei nicht gefunden
talk dgram udp wait root /usr/sbin/tcpd in.talkd
ntalk dgram udp wait root /usr/sbin/tcpd in.talkd
netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd


# die Datei "/bla" gibt es nicht
grep text /bla >& /dev/null
echo?
2


== Optionen ==
== Optionen ==
Zeile 217: Zeile 124:


=== Schreibweisen ===
=== Schreibweisen ===
Dabei gibt es zwei Varianten, die Optionen anzugeben. Diese Varianten gibt es bei den meisten Linux-Befehlen:
Dabei gibt es zwei Varianten, die Optionen anzugeben
# die Kurzform, ein Minuszeichen und direkt dahinter der Optionsbuchstabe. Bsp: -c
* Diese Varianten gibt es bei den meisten Linux-Befehlen:
# Vorteile: kürzer, und bei dieser Form kannst du auch gleich mehrere Optionen hintereinander klemmen, z.&nbsp;B.&nbsp;-ciw
# die Kurzform, ein Minuszeichen und direkt dahinter der Optionsbuchstabe
# die Langform, zwei Minuszeichen und der Optionsname ausgeschrieben. Bsp: –count
* Bsp: -c
# Vorteile: kürzer, und bei dieser Form kannst du auch gleich mehrere Optionen hintereinander klemmen, beispielsweise -ciw
# die Langform, zwei Minuszeichen und der Optionsname ausgeschrieben
* Bsp: -count


=== Regular expression Syntax ===
=== Regular expression Syntax ===
Zeile 245: Zeile 155:


=== Groß- und Kleinschreibung ignorieren ===
=== Groß- und Kleinschreibung ignorieren ===
Standardmässig sucht der grep-Befehl ''case-sensitive'', das heisst, die Groß- und Kleinschreibung wird beachtet. Willst du ohne dies, also ''case-insensitive'', suchen, musst du die Option -i hinzufügen
Standardmässig sucht der grep-Befehl ''case-sensitive'', das heisst, die Groß- und Kleinschreibung wird beachtet
* Willst du ohne dies, also ''case-insensitive'', suchen, musst du die Option -i hinzufügen


=== -i ===
=== -i ===
Zeile 258: Zeile 169:


=== Nur ganze Wörter finden ===
=== Nur ganze Wörter finden ===
Per default findet grep alle Vorkommen des Suchstrings, sowohl in Wortteilen als auch ganzen Wörten. Nur auf Vorkommen in ganzen Wörtern beschränkst du per -w
Per default findet grep alle Vorkommen des Suchstrings, sowohl in Wortteilen als auch ganzen Wörten
* Nur auf Vorkommen in ganzen Wörtern beschränkst du per -w


=== -w ===
=== -w ===
Zeile 269: Zeile 181:
  keine Tomaten
  keine Tomaten


== Ausgabe anpassen ==
== Beispiele ==
=== Treffer einfärben ===
{| class="wikitable options"
Standardmäßig ist die Ausgabe von grep farblos. Für die Übersichtlichkeit ist es hilfreich, wenn du das gematchte Pattern in jeder Zeile farblich hervorhebst
|-
! Beispiele !! Befehl
|-
| Grafikkarte ausgeben || lspci | grep VGA
|-
| "foobar" am Anfang finden in datei1.txt UND datei2.txt || grep '^foobar' datei1.txt datei2.txt
|-
| Leerzeilen finden || grep '^$' file.php
|-
| Zeilen mit "ein", als ganzes Wort, nicht "Bein" oder "einziehen" || grep -w 'ein' datei.txt
|-
| Zeige alle HDDs an || dmesg | grep -E '(s|h)d[a-z]'
|-
| Liste alle mysql Prozesse auf || ps aux | grep mysql
|}


=== --color ===
=== Weitere Beispiele ===
Hebt Treffer farblich hervor
==== In einer bestimmten Datei nach einem Wort suchen ====
grep suchwort datei.txt


=== Per default ===
==== Alle Dateien im aktuellen Ordner und Unterordnern, die einen bestimmten Text enthalten ====
==== --color // bashrc alias? ====
grep -R "suchwort" *
Ich habe das per Default in meiner .bashrc/.zshrc. Wenn du dies auch willst, musst du nur die Zeile


export GREP_OPTIONS='--color=auto'
==== Dateien im aktuellen Ordner, die wort1 oder wort2 im Inhalt haben ====
grep -E "(wort1|wort2)" *


in deiner Shell-Config-File einfügen. Falls dir die Farbe nicht gefällt, kannst du sie per
==== Dateien in Unterordner ====
egrep -rni -e "ubuntuusers" /var/www * Findet rekursiv (-r) alle Dateien im Verzeichnis /var/www
* in denen die Zeichenkette ubuntuusers auftritt,
* unabhängig von Groß- und Kleinschreibung (Option -i)
* Die Treffer werden unter Angabe der Datei und der Zeilennummer (Option -n) auf der Standardausgabe ausgegeben


export GREP_COLOR='1;32'
==== Anzahl der Treffer ====
egrep -rc -e "toll" /usr/src * Gibt an, wie oft (Option -c) die Zeichenkette toll in welchen Dateien im Verzeichnis /usr/src vorkommt


nach Belieben ändern. Für eine andere Farbe einfach einen der Farbcodes in den Hochkommata ersetzen
==== Fehler in Log-Datei ====
egrep -w "EE|WW" /var/log/Xorg.0.log * Durchsuchen einer speziellen [https://wiki.ubuntuusers.de/Logdateien Logdatei]
* nach Zeilen, welche die Zeichenkette EE oder WW als Kennzeichnung von Fehlern und Warnungen enthalten,
* nicht jedoch nur vollständige Wörter wie SCREEN, welche ebenfalls EE enthalten


Black 0;30 Dark Gray 1;30
==== Binärdateien nicht durchsuchen ====
  Blue 0;34 Light Blue 1;34
  grep -rIo "\-session" ~
  Green 0;32 Light Green 1;32
  * Durchsuchen des gesamten eigenen [https://wiki.ubuntuusers.de/Homeverzeichnis Homeverzeichnisses] "~" mit nach Textdateien ([https://wiki.ubuntuusers.de/Software_Problembehebung#Saubere-Konfiguration Konfigurationsdateien], [https://wiki.ubuntuusers.de/Logdateien Logdateien], Textdokumente...),
Cyan 0;36 Light Cyan 1;36
* welche die Zeichenfolge -session (Option) enthalten
Red 0;31 Light Red 1;31
* Binärdateien wie Videos werden durch -I ausgeschlossen,
Purple 0;35 Light Purple 1;35
* -o beschränkt die Zeichenkette auf das Suchwort -session
Brown 0;33 Yellow 1;33
* "\" verhindert eine Fehlermeldung von grep durch das fälschlicherweise Auswerten von
Light Gray 0;37 White 1;37
* -s aus -session als Option statt als Suchbegriff -session


=== Trefferanzahl anzeigen ===
==== Suche nach den geladenen Soundtreibern ====
Die Anzahl aller Zeilen, die das Suchmuster beinhalten, kannst du dir mit -c oder –count ausgeben lassen. Damit liefert grep die reine Anzahl, also z.&nbsp;B.&nbsp;“4″ für 4 Treffer zurück, sonst nichts
lsmod | grep snd
* Ausgabe aller geladenen Treiber, die als Module vorliegen, durch lsmod,
* wobei die Ausgabe durch den [https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_für_Anfänger#Umleitungen Operator] "|" an grep umgeleitet wird
* grep gibt nur die Zeilen aus, die die Zeichenfolge snd enthalten


=== -c ===
=== Egrep - Beispiele ===
Anzeige der Anzahl Zeilen, in denen das Muster gefunden wurde
Egrep ist hilfreich, wenn Sie nach Zeilen in der Eingabe suchen, die mindestens eine von mehreren Zeichenketten enthalten


  $ grep -c bash /etc/passwd
So findet das folgende Beispiel alle Zeilen der Datei /etc/fstab, in denen ''floppy'' und ''cdrom'' auftauchen:
  38
  egrep 'floppy|cdrom' /etc/fstab
/dev/hdc /cdrom iso9660 ro,noauto,user,exec 0 0
  /dev/fd0 /floppy auto noauto,user 0 0


=== Zeilennummer anzeigen ===
Eine weitere interessante Anwendung ist die Suche nach ''geteilten'' Mustern, d.h
Sinnvoll vor allem bei Sourcecode-Dateien ist die Option -n. Wenn du dem grep-Befehl diese Option mitgibst, wird vor jedes Match die Zeilennummer des Matches geschrieben
* die bekannten Teile stehen auf einer Zeile, aber der Zwischenraum ist unbekannt


=== -n ===
Zur Demonstration dient folgende Datei:
Zeigt die Zeilennummer an, in der das Muster gefunden wurde
cat beispiel.txt
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum


$ grep -n root /etc/passwd
Gesucht werden sollen alle Zeilen, die ''einen Zwischenraum'' enthalten; jedoch ist die Zusammensetzung des Zwischenraums nicht bekannt (und besteht teils aus Leerzeichen, teils aus Tabulatoren und teils aus beidem)
1:root:x:0:0:root:/root:/bin/bash


=== Nur Dateinamen ausgeben lassen ===
Mit dem normalen grep könnte man sich mit folgendem Konstrukt behelfen:
Manchmal braucht man nur den/die Dateinamen, in denen der Suchstring gefunden wurde. Das kannst du über die Option -l (kleines “L”) erreichen


=== -l ===
grep "ein[[:space:]][[:space:]]*Zwischenraum" beispiel.txt
Nur Anzeige der Namen der Dateien, in denen das Muster gefunden wurde
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum


$ grep -l tcp /etc/host*
Die doppelte Anwendung des [:space:]-Musters ist für diesen Fall notwendiger Ballast, da wir ja mindestens einen Zwischenraum benötigen
/etc/hosts.allow
/etc/hosts.deny


=== Dateinamen ohne Treffer ===
Eleganter ist da die Möglichkeit von "+" in Verbindung mit egrep:
=== -L ===
egrep "ein[[:space:]]+Zwischenraum" beispiel.txt
Auch gibt es Anwendungsfälle, in denen du nur die Dateinamen aufgelistet haben willst, in denen der Suchstring NICHT gefunden wurde. Dafür nutzt du die Option -L
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum


=== Kontext anzeigen ===
=== -A [Anzahl] ===
Zeigt Anzahl Zeilen an, die der Zeile mit dem Muster folgen


grep -A 2 root /etc/passwd
<noinclude>
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
 
=== -B [Anzahl] ===
Zeigt Anzahl Zeilen an, die vor der Zeile mit dem Muster liegen
 
=== -C [Anzahl] ===
Anzahl Zeilen vor- und nach dem Treffer
 
=== Ausgabe unterdrücken ===
=== -s ===
Unterdrückt die Fehlerausgaben (Standardfehler); sinnvoll in Skripten
 
=== Muster aus Datei laden ===
Wer komplexer Suchmuster immer wieder verwendet, kann diese in Dateien speichern und im grep-Befehl per ''-f regexdatei'' einbinden
 
=== Beispiel ===
alle Zeilen mit Emailadressen aus einer Datei filtern
 
grep -E '([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})' datei.txt
 
Den Regular expression ohne die einfachen Anführungsstriche in eine Datei schreiben:
 
echo '([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})' > \ ~/snippets/regexes/email
 
Nun kannst du den Regular expression im obigen Beispiel mit dem File ersetzen:
 
grep -Ef ~/snippets/regexes/email datei.txt
 
Tipp
 
Mach es dir zur Gewohnheit, immer alle Regular expressiones, die du verwendest, unter einem aussagekräftigen Dateinamen in einem bestimmten Verzeichnis zu speichern. So sammelst du mit der Zeit ein komfortables, wiederverwendbares Regular expression-Kompendium
 
== Beispiele ==
=== Grafikkarte ausgeben ===
lspci | grep VGA
 
=== “foobar” am Anfang finden ===
in datei1.txt UND datei2.txt
 
grep '^foobar' datei1.txt datei2.txt
 
=== Leerzeilen finden ===
grep '^$' file.php
 
=== Zeilen mit “ein”, als ganzes Wort ===
nicht “Bein” oder “einziehen”
 
grep -w 'ein' datei.txt
 
=== Zeige alle HDDs an ===
dmesg | grep -E '(s|h)d[a-z]'
 
=== Liste alle mysql Prozesse auf ===
ps aux | grep mysql


== Reguläre Ausdrücke in grep ==
== Reguläre Ausdrücke in grep ==
Unter Linux wird GNU grep genutzt, dass Erweiterte Reguläre ausdrücke unterstüzt. GNU grep standard auf allen Linux-Systemen
Unter Linux wird GNU grep genutzt, dass Erweiterte Reguläre ausdrücke unterstüzt
* GNU grep standard auf allen Linux-Systemen


=== Reguläre Ausdrücke ===
=== Reguläre Ausdrücke ===
Ein Regulärer Ausdruck ist nichts als ein Muster dass auf für jede Eingabezeile zutreffen soll. Ein Muster ist eine Reihe von Zeichen. Hier einige Beispiele:
Ein Regulärer Ausdruck ist nichts als ein Muster dass auf für jede Eingabezeile zutreffen soll
* Ein Muster ist eine Reihe von Zeichen


^w1
; Beispiele
w1|w2
^w1
[^ ]
w1|w2
[^ ]


=== Reguläre Ausdrücke für grep ===
=== Reguläre Ausdrücke für grep ===
Suche nach 'vivek' in /etc/passswd
Suche nach 'vivek' in /etc/passswd
  grep vivek /etc/passwd
  grep vivek /etc/passwd


Beispielausgabe:
Beispielausgabe:
 
vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh
gitevivek:x:1002:1002::/home/gitevivek:/bin/sh
gitevivek:x:1002:1002::/home/gitevivek:/bin/sh


Suche in Groß- und Kleinschreibung
Suche in Groß- und Kleinschreibung
  grep -i -w vivek /etc/passwd
  grep -i -w vivek /etc/passwd


Suche nach 'vivek' oder 'raj' in Groß- und Kleinschreibung
Suche nach 'vivek' oder 'raj' in Groß- und Kleinschreibung
  grep -E -i -w 'vivek|raj' /etc/passwd
  grep -E -i -w 'vivek|raj' /etc/passwd


Zeile 423: Zeile 309:


=== Anker ===
=== Anker ===
You can use ^ and to force a regex to match only at the start or end of a line, respectively. The following example displays lines starting with the vivek only:
You can use ^ and to force a regex to match only at the start or end of a line, respectively
 
* The following example displays lines starting with the vivek only:
  grep ^vivek /etc/passwd
  grep ^vivek /etc/passwd


Sample outputs:
Sample outputs:
 
vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh


You can display only lines starting with the word vivek only i.e. do not display vivekgite, vivekg etc:
You can display only lines starting with the word vivek only i.e. do not display vivekgite, vivekg etc:
  grep -w ^vivek /etc/passwd
  grep -w ^vivek /etc/passwd


Find lines ending with word foo:
Find lines ending with word foo:
  grep 'foo$' filename
  grep 'foo$' filename


Match line only containing foo:
Match line only containing foo:
  grep '^foo$' filename
  grep '^foo$' filename


You can search for blank lines with the following examples:
You can search for blank lines with the following examples:
  grep '^$' filename
  grep '^$' filename


=== Zeichenklassen ===
=== Zeichenklassen ===
Match Vivek or vivek:
Match Vivek or vivek:
  grep '[vV]ivek' filename
  grep '[vV]ivek' filename
OR
OR
  grep '[vV][iI][Vv][Ee][kK]' filename
  grep '[vV][iI][Vv][Ee][kK]' filename


You can also match digits (i.e match vivek1 or Vivek2 etc):
You can also match digits (i.e match vivek1 or Vivek2 etc):
  grep -w '[vV]ivek[0-9]' filename
  grep -w '[vV]ivek[0-9]' filename


You can match two numeric digits (i.e. match foo11, foo12 etc):
You can match two numeric digits (i.e
* match foo11, foo12 etc):


  grep 'foo[0-9][0-9]' filename
  grep 'foo[0-9][0-9]' filename
Zeile 473: Zeile 351:
  grep [wn] filename
  grep [wn] filename


Within a bracket expression, the name of a character class enclosed in "[:" and ":]" stands for the list of all characters belonging to that class. Standard character class names are:* [:alnum:] - Alphanumeric characters
Within a bracket expression, the name of a character class enclosed in "[:" and ":]" stands for the list of all characters belonging to that class
* Standard character class names are:* [:alnum:] - Alphanumeric characters
* [:alpha:] - Alphabetic characters
* [:alpha:] - Alphabetic characters
* [:blank:] - Blank characters: space and tab
* [:blank:] - Blank characters: space and tab
Zeile 486: Zeile 365:


=== Wildcards ===
=== Wildcards ===
You can use the "." for a single character match. In this example match all 3 character word starting with "b" and ending in "t":
You can use the "." for a single character match
 
* In this example match all 3 character word starting with "b" and ending in "t":
grep '\<b.t\>' /etc/services
grep '\<b.t\>' /etc/services


Where,* \< Match the empty string at the beginning of word
Where,* \< Match the empty string at the beginning of word
Zeile 568: Zeile 447:
  grep -o regex filename
  grep -o regex filename


== Arbeiten mit grep ==
== Anhang ==
=== Einfache Wortsuche ===
=== Siehe auch ===
grep root /etc/passwd
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}
 
Zeigt alle Zeilen, die root in genau dieser Schreibweise enthalten
 
=== Suche nach Wortvariationen ===
grep -i Root /etc/passwd
 
Ignoriert Groß-/Kleinschreibung
 
grep will[iy] /etc/passwd
 
Findet Zeilen die willi und willy enthalten
 
grep will[^y] /etc/passwd
 
Findet nicht willy nicht enthalten, aber willi, willo usw
 
=== Leere Zeilen entfernen ===
grep -v '^$' /etc/services


Wenn ein Zeilenende auf einen Zeilenanfang ^ folgt so werden leere Zeilen gefunden. -v invertiert die Ergebnisse und gibt Leerzeilen nicht aus
=== Dokumentation ===


=== Kommentare filtern ===
; Man-Page
grep -v '^#' /etc/services
* grep
* regex(7)


Zeilen mit einem Kommentarzeichen # am Zeilenanfang ^ gelten in Shellskripten als Kommentare. -v invertiert die Ergebnisse und gibt Zeilen mit Kommentaren nicht aus
; Info-Pages
 
=== Anzahl der Treffer ermitteln ===
grep -c '^#' /etc/services
 
Gibt die Anzahl der Kommentarzeilen in der Datei an
 
=== Treffer im Zusammenhang sehen ===
grep -C2 NFS /etc/services
 
Zeigt Treffer mit den beiden Zeilen davor und danach
 
=== In welcher Datei wird eine Variable gesetzt? ===
Bei der Systemadministration fragt man sich häufig, in welcher Datei eigentlich welche Shell-Variable gesetzt wird? Die globalen Vorgaben erfolgen zum Großteil in den Dateien des Verzeichnisses /etc
 
=== Namen der Dateien, in denen z.&nbsp;B.&nbsp;die PATH-Variable modifiziert wird ===
grep -l PATH /etc/* 2>/dev/null
/etc/csh.cshrc
/etc/login.defs
/etc/manpath.config
/etc/profile
/etc/profile.rpmsave
/etc/rc.config
/etc/squid.conf
 
Eventuell ist die Umleitung der Fehlerausgabe (2>/dev/null) sinnvoll
 
=== Wie viele Benutzer sind Mitglied einer Gruppe? ===
Wie viele Nutzer sind Mitglied in der default-Gruppe users (GID 100)?
 
grep -c ':[0-9]\{1,\}:100:' /etc/passwd
9
 
Bei der Angabe des Suchmusters hilft uns die Kenntnis des Aufbaus der Datei »/etc/passwd«. * Dabei steht die GruppenID immer zwischen zwei Doppelpunkten
* Allerdings könnte es sein, dass auch die NutzerID (UID) 100 vergeben ist - der Ausdruck :[0-9]\{1,\}:100: garantiert, dass :100: das zweite rein numerische Feld betrifft
 
Eine andere Schreibweise wäre:
 
grep -c ':[[:digit:]]\{1,\}:100:' /etc/passwd
9
 
=== Netzwerkdienste über UDP ===
Welche Netzwerkdienste über UDP sind auf unserem System verfügbar (Datei /etc/inetd.conf)?
 
grep '^[^#].*[[:space:]]udp' /etc/inetd.conf
time dgram udp wait root internal
talk dgram udp wait root /usr/sbin/tcpd in.talkd
ntalk dgram udp wait root /usr/sbin/tcpd in.talkd
netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd * Jede Zeile, die mit einem # beginnt, ist ein Kommentar
 
* Also filtern wir solche Zeilen aus (^[^#]). Das gesuchte Protokoll ist "udp"
* Vor diesem Schlüsselwort können beliebig viele Zeichen (.*) gefolgt von einem Leerzeichen oder Tabulator ([[:space:]]) stehen.
 
=== Einfacher mit Pipe ===
Je gezielter man nach Informationen fahndet, desto verwirrender wird die Angabe der Suchmusters
 
In zahlreichen Fällen wird die Verwendung von [http://eaumleitung.htm/#pipes Pipes] einleuchtender sein
 
Das Ergebnis aus obigen Beispiel erhält man auch mit folgender Befehlsfolge:
 
grep -w udp /etc/inetd.conf | grep -v ^#
time dgram udp wait root internal
talk dgram udp wait root /usr/sbin/tcpd in.talkd
ntalk dgram udp wait root /usr/sbin/tcpd in.talkd
netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd
 
== Weitere Beispiele ==
==== In einer bestimmten Datei nach einem Wort suchen ====
grep suchwort datei.txt
 
==== Alle Dateien im aktuellen Ordner und Unterordnern, die einen bestimmten Text enthalten ====
grep -R "suchwort" *
 
==== Dateien im aktuellen Ordner, die wort1 oder wort2 im Inhalt haben ====
grep -E "(wort1|wort2)" *
 
==== Dateien in Unterordner ====
egrep -rni -e "ubuntuusers" /var/www * Findet rekursiv (<tt>-r</tt>) alle Dateien im Verzeichnis /var/www
* in denen die Zeichenkette ubuntuusers auftritt,
* unabhängig von Groß- und Kleinschreibung (Option <tt>-i</tt>)
* Die Treffer werden unter Angabe der Datei und der Zeilennummer (Option <tt>-n</tt>) auf der Standardausgabe ausgegeben
 
==== Anzahl der Treffer ====
egrep -rc -e "toll" /usr/src * Gibt an, wie oft (Option <tt>-c</tt>) die Zeichenkette <tt>toll</tt> in welchen Dateien im Verzeichnis /usr/src vorkommt
 
==== Fehler in Log-Datei ====
egrep -w "EE|WW" /var/log/Xorg.0.log * Durchsuchen einer speziellen [http://wiki.ubuntuusers.de/Logdateien Logdatei]
* nach Zeilen, welche die Zeichenkette <tt>EE</tt> oder <tt>WW</tt> als Kennzeichnung von Fehlern und Warnungen enthalten,
* nicht jedoch nur vollständige Wörter wie <tt>SCREEN</tt>, welche ebenfalls <tt>EE</tt> enthalten
 
==== Binärdateien nicht durchsuchen ====
grep -rIo "\-session" ~
* Durchsuchen des gesamten eigenen [http://wiki.ubuntuusers.de/Homeverzeichnis Homeverzeichnisses] "<tt>~</tt>" mit nach Textdateien ([http://wiki.ubuntuusers.de/Software_Problembehebung#Saubere-Konfiguration Konfigurationsdateien], [http://wiki.ubuntuusers.de/Logdateien Logdateien], Textdokumente...),
* welche die Zeichenfolge <tt>-session</tt> (Option) enthalten
* Binärdateien wie Videos werden durch <tt>-I</tt> ausgeschlossen,
* <tt>-o</tt> beschränkt die Zeichenkette auf das Suchwort <tt>-session</tt>
* "\" verhindert eine Fehlermeldung von <tt>grep</tt> durch das fälschlicherweise Auswerten von
* <tt>-s</tt> aus <tt>-session</tt> als Option statt als Suchbegriff <tt>-session</tt>
 
==== Suche nach den geladenen Soundtreibern ====
lsmod | grep snd
* Ausgabe aller geladenen Treiber, die als Module vorliegen, durch <tt>lsmod</tt>,
* wobei die Ausgabe durch den [http://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_für_Anfänger#Umleitungen Operator] "<tt>|</tt>" an <tt>grep</tt> umgeleitet wird
* <tt>grep</tt> gibt nur die Zeilen aus, die die Zeichenfolge <tt>snd</tt> enthalten
 
=== Egrep - Beispiele ===
Egrep ist hilfreich, wenn Sie nach Zeilen in der Eingabe suchen, die mindestens eine von mehreren Zeichenketten enthalten
 
So findet das folgende Beispiel alle Zeilen der Datei /etc/fstab, in denen »floppy« und »cdrom« auftauchen:
egrep 'floppy|cdrom' /etc/fstab
/dev/hdc /cdrom iso9660 ro,noauto,user,exec 0 0
/dev/fd0 /floppy auto noauto,user 0 0
 
Eine weitere interessante Anwendung ist die Suche nach »geteilten« Mustern, d.h. die bekannten Teile stehen auf einer Zeile, aber der Zwischenraum ist unbekannt
 
Zur Demonstration dient folgende Datei:
cat beispiel.txt
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum
 
Gesucht werden sollen alle Zeilen, die »einen Zwischenraum« enthalten; jedoch ist die Zusammensetzung des Zwischenraums nicht bekannt (und besteht teils aus Leerzeichen, teils aus Tabulatoren und teils aus beidem)
 
Mit dem normalen grep könnte man sich mit folgendem Konstrukt behelfen:
 
grep "ein[[:space:]][[:space:]]*Zwischenraum" beispiel.txt
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum
 
Die doppelte Anwendung des [:space:]-Musters ist für diesen Fall notwendiger Ballast, da wir ja mindestens einen Zwischenraum benötigen
 
Eleganter ist da die Möglichkeit von "+" in Verbindung mit egrep:
egrep "ein[[:space:]]+Zwischenraum" beispiel.txt
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum
 
== Quellen ==
* man page grep and regex(7)
* info page grep
* info page grep


=== Links ===
=== Links ===
* [http://wiki.ubuntuusers.de/pgrep pgrep] - gezielt nach der PID suchen / filternhttp://wiki.ubuntuusers.de/pgrep
==== Projekt ====
* [http://wiki.ubuntuusers.de/pdfgrep pdfgrep] - PDF-Dateien durchsuchenhttp://wiki.ubuntuusers.de/pdfgrep
 
* [http://de.wikipedia.org/wiki/grep grep in der Wikipedia]http://de.wikipedia.org/wiki/grep
==== Weblinks ====
* [http://www.gnu.org/software/grep/ GNU grep]http://www.gnu.org/software/grep/
* [https://wiki.ubuntuusers.de/pgrep pgrep] - gezielt nach der PID suchen / filternhttps://wiki.ubuntuusers.de/pgrep
* [http://de.wikipedia.org/wiki/Regulärer_Ausdruck#Regul.C3.A4re_Ausdr.C3.BCcke_in_der_Praxis Erklärung regulärer Ausdrücke]http://de.wikipedia.org/wiki/Regulärer_Ausdruck
* [https://wiki.ubuntuusers.de/pdfgrep pdfgrep] - PDF-Dateien durchsuchenhttps://wiki.ubuntuusers.de/pdfgrep
* [https://de.wikipedia.org/wiki/grep grep in der Wikipedia]https://de.wikipedia.org/wiki/grep
* [https://www.gnu.org/software/grep/ GNU grep]https://www.gnu.org/software/grep/
* [https://de.wikipedia.org/wiki/Regulärer_Ausdruck#Regul.C3.A4re_Ausdr.C3.BCcke_in_der_Praxis Erklärung regulärer Ausdrücke]https://de.wikipedia.org/wiki/Regulärer_Ausdruck


=== Grafische Werkzeuge ===
===== Grafische Werkzeuge =====
Für den Einsatz innerhalb einer Desktop-Umgebung sind gedacht [http://searchmonkey.embeddediq.com/ Searchmonkey]http://searchmonkey.embeddediq.com/
Für den Einsatz innerhalb einer Desktop-Umgebung sind gedacht [https://searchmonkey.embeddediq.com/ Searchmonkey]https://searchmonkey.embeddediq.com/
* [http://regexxer.sourceforge.net/ regexxer] http://regexxer.sourceforge.net/
* [https://regexxer.sourceforge.net/ regexxer] https://regexxer.sourceforge.net/
* [http://sourceforge.net/projects/jgrep jGrep] http://sourceforge.net/projects/jgrep
* [https://sourceforge.net/projects/jgrep jGrep] https://sourceforge.net/projects/jgrep
* [http://sethoscope.net/grepui/ grepui]http://sethoscope.net/grepui/
* [https://sethoscope.net/grepui/ grepui]https://sethoscope.net/grepui/


[[Kategorie:Linux/Suchen]]
[[Kategorie:Linux/Befehl]]
[[Kategorie:Linux/Befehl]]


{{DISPLAYTITLE:grep}}
</noinclude>

Aktuelle Version vom 11. Mai 2025, 20:51 Uhr

Grep/Anwendung

Beschreibung

Mit regular expression lassen sich Dateien nach bestimmten Textstücken durchsuchen

  • Die Suchmuster werden regular expressions genannt
  • Sie sind vielfältig einsetzbar und werden nicht nur von grep verwendet

Global search for a regular expression and print out matched lines

  • kurz 'g/re/p' ist das gebräuchlichste Kommando, um in Dateien nach bestimmten Mustern zu suchen

Einsatzgebiete

Suche in Dateien durchsucht

In Zusammenarbeit mit find kann ein ganzer Dateibaum gelesen werden

find /home/benutzername -exec grep -H "Passwort" {} \;

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

Manche grep-Versionen ermöglichen eine kürzere Formulierung mithilfe der Option -r

grep -r "Passwort" /home/benutzername

Ein zweites Einsatzgebiet ist die Verwendung als Zeilen-Filter innerhalb einer Kette von Befehlen, beispielsweise

tail -1000 /var/log/mail | grep "Mailadresse"

grep schreibt alle Zeilen der Eingabe, die das gesuchte Muster enthalten, auf die Standardausgabe

Arbeiten mit grep

Einfache Wortsuche

grep root /etc/passwd

Zeigt alle Zeilen, die root in genau dieser Schreibweise enthalten

Suche nach Wortvariationen

grep -i Root /etc/passwd

Ignoriert Groß-/Kleinschreibung

grep will[iy] /etc/passwd

Findet Zeilen die willi und willy enthalten

grep will[^y] /etc/passwd

Findet nicht willy nicht enthalten, aber willi, willo usw

Leere Zeilen entfernen

grep -v '^$' /etc/services

Wenn ein Zeilenende auf einen Zeilenanfang ^ folgt so werden leere Zeilen gefunden. -v invertiert die Ergebnisse und gibt Leerzeilen nicht aus

Kommentare filtern

grep -v '^#' /etc/services

Zeilen mit einem Kommentarzeichen # am Zeilenanfang ^ gelten in Shellskripten als Kommentare. -v invertiert die Ergebnisse und gibt Zeilen mit Kommentaren nicht aus

Anzahl der Treffer ermitteln

grep -c '^#' /etc/services

Gibt die Anzahl der Kommentarzeilen in der Datei an

Treffer im Zusammenhang sehen

grep -C2 NFS /etc/services

Zeigt Treffer mit den beiden Zeilen davor und danach

In welcher Datei wird eine Variable gesetzt?

Bei der Systemadministration fragt man sich häufig, in welcher Datei eigentlich welche Shell-Variable gesetzt wird? Die globalen Vorgaben erfolgen zum Großteil in den Dateien des Verzeichnisses /etc

Namen der Dateien, in denen beispielsweise die PATH-Variable modifiziert wird

grep -l PATH /etc/* 2>/dev/null
/etc/csh.cshrc
/etc/login.defs
/etc/manpath.config
/etc/profile
/etc/profile.rpmsave
/etc/rc.config
/etc/squid.conf

Eventuell ist die Umleitung der Fehlerausgabe (2>/dev/null) sinnvoll

Wie viele Benutzer sind Mitglied einer Gruppe?

Wie viele Nutzer sind Mitglied in der default-Gruppe users (GID 100)?

grep -c ':[0-9]\{1,\}:100:' /etc/passwd
9

Bei der Angabe des Suchmusters hilft uns die Kenntnis des Aufbaus der Datei /etc/passwd. * Dabei steht die GruppenID immer zwischen zwei Doppelpunkten

  • Allerdings könnte es sein, dass auch die NutzerID (UID) 100 vergeben ist - der Ausdruck :[0-9]\{1,\}:100: garantiert, dass :100: das zweite rein numerische Feld betrifft

Eine andere Schreibweise wäre:

grep -c ':digit:\{1,\}:100:' /etc/passwd
9

Netzwerkdienste über UDP

Welche Netzwerkdienste über UDP sind auf unserem System verfügbar (Datei /etc/inetd.conf)?

grep '^[^#].*space:udp' /etc/inetd.conf
time dgram udp wait root internal
talk dgram udp wait root /usr/sbin/tcpd in.talkd
ntalk dgram udp wait root /usr/sbin/tcpd in.talkd
netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd * Jede Zeile, die mit einem # beginnt, ist ein Kommentar
  • Also filtern wir solche Zeilen aus (^[^#])
  • Das gesuchte Protokoll ist "udp"
  • Vor diesem Schlüsselwort können beliebig viele Zeichen (.*) gefolgt von einem Leerzeichen oder Tabulator (space:) stehen

Einfacher mit Pipe

Je gezielter man nach Informationen fahndet, desto verwirrender wird die Angabe der Suchmusters

In zahlreichen Fällen wird die Verwendung von Pipes einleuchtender sein

Das Ergebnis aus obigen Beispiel erhält man auch mit folgender Befehlsfolge:

grep -w udp /etc/inetd.conf | grep -v ^#
time dgram udp wait root internal
talk dgram udp wait root /usr/sbin/tcpd in.talkd
ntalk dgram udp wait root /usr/sbin/tcpd in.talkd
netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd


Optionen

Mittels verschiedener Optionen kannst du das Verhalten und die Ausgabe von grep verändern

Schreibweisen

Dabei gibt es zwei Varianten, die Optionen anzugeben

  • Diese Varianten gibt es bei den meisten Linux-Befehlen:
  1. die Kurzform, ein Minuszeichen und direkt dahinter der Optionsbuchstabe
  • Bsp: -c
  1. Vorteile: kürzer, und bei dieser Form kannst du auch gleich mehrere Optionen hintereinander klemmen, beispielsweise -ciw
  2. die Langform, zwei Minuszeichen und der Optionsname ausgeschrieben
  • Bsp: -count

Regular expression Syntax

Sollen ERE genutzt werden, +, ?, | und (), muss der Parameter -E angegebenen werden

Unterverzeichnisse durchsuchen

-r

(recursive) durchsucht Unterverzeichnisse

NICHT betroffene Zeilen anzeigen

-v

Zeigt alle Zeilen an, die das Muster nicht enthalte

ohne -v

$ ps ax | grep inetd
133 ? S 0:00 /usr/sbin/inetd
762 pts/2 S 0:00 grep inetd

die Ausgabe "grep" herausfiltern

ps ax | grep inetd | grep -v grep
133 ? S 0:00 /usr/sbin/inetd

Groß- und Kleinschreibung ignorieren

Standardmässig sucht der grep-Befehl case-sensitive, das heisst, die Groß- und Kleinschreibung wird beachtet

  • Willst du ohne dies, also case-insensitive, suchen, musst du die Option -i hinzufügen

-i

Groß- und Kleinschreibung werden nicht unterschieden

$ grep -i ROot /etc/passwd
root:x:0:0:root:/root:/bin/bash

Einziger Inhalt

-x

Findet Zeilen, die den Suchstring als einzigen Inhalt haben

Nur ganze Wörter finden

Per default findet grep alle Vorkommen des Suchstrings, sowohl in Wortteilen als auch ganzen Wörten

  • Nur auf Vorkommen in ganzen Wörtern beschränkst du per -w

-w

Das Suchmuster muss ein einzelnes Wort sein (also kein Bestandteil eines anderen Wortes)

echo -e "Automaten\n essen\n keine Tomaten" | grep -i Tomaten
Automaten
keine Tomaten
echo -e "Automaten\n essen\n keine Tomaten" | grep -iw Tomaten
keine Tomaten

Beispiele

Beispiele Befehl
Grafikkarte ausgeben grep VGA
"foobar" am Anfang finden in datei1.txt UND datei2.txt grep '^foobar' datei1.txt datei2.txt
Leerzeilen finden grep '^$' file.php
Zeilen mit "ein", als ganzes Wort, nicht "Bein" oder "einziehen" grep -w 'ein' datei.txt
Zeige alle HDDs an grep -E '(s|h)d[a-z]'
Liste alle mysql Prozesse auf grep mysql

Weitere Beispiele

In einer bestimmten Datei nach einem Wort suchen

grep suchwort datei.txt

Alle Dateien im aktuellen Ordner und Unterordnern, die einen bestimmten Text enthalten

grep -R "suchwort" *

Dateien im aktuellen Ordner, die wort1 oder wort2 im Inhalt haben

grep -E "(wort1|wort2)" *

Dateien in Unterordner

egrep -rni -e "ubuntuusers" /var/www * Findet rekursiv (-r) alle Dateien im Verzeichnis /var/www

  • in denen die Zeichenkette ubuntuusers auftritt,
  • unabhängig von Groß- und Kleinschreibung (Option -i)
  • Die Treffer werden unter Angabe der Datei und der Zeilennummer (Option -n) auf der Standardausgabe ausgegeben

Anzahl der Treffer

egrep -rc -e "toll" /usr/src * Gibt an, wie oft (Option -c) die Zeichenkette toll in welchen Dateien im Verzeichnis /usr/src vorkommt

Fehler in Log-Datei

egrep -w "EE|WW" /var/log/Xorg.0.log * Durchsuchen einer speziellen Logdatei

  • nach Zeilen, welche die Zeichenkette EE oder WW als Kennzeichnung von Fehlern und Warnungen enthalten,
  • nicht jedoch nur vollständige Wörter wie SCREEN, welche ebenfalls EE enthalten

Binärdateien nicht durchsuchen

grep -rIo "\-session" ~
* Durchsuchen des gesamten eigenen Homeverzeichnisses "~" mit nach Textdateien (Konfigurationsdateien, Logdateien, Textdokumente...),
  • welche die Zeichenfolge -session (Option) enthalten
  • Binärdateien wie Videos werden durch -I ausgeschlossen,
  • -o beschränkt die Zeichenkette auf das Suchwort -session
  • "\" verhindert eine Fehlermeldung von grep durch das fälschlicherweise Auswerten von
  • -s aus -session als Option statt als Suchbegriff -session

Suche nach den geladenen Soundtreibern

lsmod | grep snd
  • Ausgabe aller geladenen Treiber, die als Module vorliegen, durch lsmod,
  • wobei die Ausgabe durch den Operator "|" an grep umgeleitet wird
  • grep gibt nur die Zeilen aus, die die Zeichenfolge snd enthalten

Egrep - Beispiele

Egrep ist hilfreich, wenn Sie nach Zeilen in der Eingabe suchen, die mindestens eine von mehreren Zeichenketten enthalten

So findet das folgende Beispiel alle Zeilen der Datei /etc/fstab, in denen floppy und cdrom auftauchen:

egrep 'floppy|cdrom' /etc/fstab
/dev/hdc /cdrom iso9660 ro,noauto,user,exec 0 0
/dev/fd0 /floppy auto noauto,user 0 0

Eine weitere interessante Anwendung ist die Suche nach geteilten Mustern, d.h

  • die bekannten Teile stehen auf einer Zeile, aber der Zwischenraum ist unbekannt

Zur Demonstration dient folgende Datei:

cat beispiel.txt
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum

Gesucht werden sollen alle Zeilen, die einen Zwischenraum enthalten; jedoch ist die Zusammensetzung des Zwischenraums nicht bekannt (und besteht teils aus Leerzeichen, teils aus Tabulatoren und teils aus beidem)

Mit dem normalen grep könnte man sich mit folgendem Konstrukt behelfen:

grep "einspace:space:*Zwischenraum" beispiel.txt
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum

Die doppelte Anwendung des [:space:]-Musters ist für diesen Fall notwendiger Ballast, da wir ja mindestens einen Zwischenraum benötigen

Eleganter ist da die Möglichkeit von "+" in Verbindung mit egrep:

egrep "einspace:+Zwischenraum" beispiel.txt
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum



Reguläre Ausdrücke in grep

Unter Linux wird GNU grep genutzt, dass Erweiterte Reguläre ausdrücke unterstüzt

  • GNU grep standard auf allen Linux-Systemen

Reguläre Ausdrücke

Ein Regulärer Ausdruck ist nichts als ein Muster dass auf für jede Eingabezeile zutreffen soll

  • Ein Muster ist eine Reihe von Zeichen
Beispiele
^w1
w1|w2
[^ ]

Reguläre Ausdrücke für grep

Suche nach 'vivek' in /etc/passswd

grep vivek /etc/passwd

Beispielausgabe:

vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh
gitevivek:x:1002:1002::/home/gitevivek:/bin/sh

Suche in Groß- und Kleinschreibung

grep -i -w vivek /etc/passwd

Suche nach 'vivek' oder 'raj' in Groß- und Kleinschreibung

grep -E -i -w 'vivek|raj' /etc/passwd

Das MUSTER in diesem Beispiel nutzt extended regular expression

Anker

You can use ^ and to force a regex to match only at the start or end of a line, respectively

  • The following example displays lines starting with the vivek only:
grep ^vivek /etc/passwd

Sample outputs:

vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh

You can display only lines starting with the word vivek only i.e. do not display vivekgite, vivekg etc:

grep -w ^vivek /etc/passwd

Find lines ending with word foo:

grep 'foo$' filename

Match line only containing foo:

grep '^foo$' filename

You can search for blank lines with the following examples:

grep '^$' filename

Zeichenklassen

Match Vivek or vivek:

grep '[vV]ivek' filename

OR

grep '[vV][iI][Vv][Ee][kK]' filename

You can also match digits (i.e match vivek1 or Vivek2 etc):

grep -w '[vV]ivek[0-9]' filename

You can match two numeric digits (i.e

  • match foo11, foo12 etc):
grep 'foo[0-9][0-9]' filename

You are not limited to digits, you can match at least one letter:

grep '[A-Za-z]' filename

Display all the lines containing either a "w" or "n" character:

grep [wn] filename

Within a bracket expression, the name of a character class enclosed in "[:" and ":]" stands for the list of all characters belonging to that class

  • Standard character class names are:* [:alnum:] - Alphanumeric characters
  • [:alpha:] - Alphabetic characters
  • [:blank:] - Blank characters: space and tab
  • [:digit:] - Digits: '0 1 2 3 4 5 6 7 8 9'
  • [:lower:] - Lower-case letters: 'a b c d e f g h i j k l m n o p q r s t u v w x y z'
  • [:space:] - Space characters: tab, newline, vertical tab, form feed, carriage return, and space
  • [:upper:] - Upper-case letters: 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'

In this example match all upper case letters:

grep '[:upper:]' filename

Wildcards

You can use the "." for a single character match

  • In this example match all 3 character word starting with "b" and ending in "t":
grep '\<b.t\>' /etc/services

Where,* \< Match the empty string at the beginning of word

  • \> Match the empty string at the end of word

Print all lines with exactly two characters

grep '^..$' filename

Display any lines starting with a dot and digit

grep '^\.[0-9]' filename

Den Punkt maskieren

The following regex to find an IP address 192.168.1.254 will not work:

grep '192.168.1.254' /etc/hosts

All three dots need to be escaped:

grep '192\.168\.1\.254' /etc/hosts

The following example will only match an IP address:

egrep 'digit:{1,3}\.digit:{1,3}\.digit:{1,3}\.digit:{1,3}' filename

The following will match word Linux or UNIX in any case:

egrep -i '^(linux|unix)' filename

Mustern mit führendem Bindestrich

Searches for all lines matching '--test--' using -e option Without -e, grep would attempt to parse '--test--' as a list of options:

grep -e '--test--' filename

Oder-Verknüpfung mit grep

Use the following syntax:

grep 'word1|word2' filename

OR

grep 'word1\|word2' filename

UND-Verknüpfung mit grep

Use the following syntax to display all lines that contain both 'word1' and 'word2'

grep 'word1' filenae | grep 'word2'

Sequenzen testen

You can test how often a character must be repeated in sequence using the following syntax:

{N}
{N,}
{min,max}

Match a character "v" two times:

egrep "v{2}" filename

The following will match both "col" and "cool":

egrep 'co{1,2}l' filename

The following will match any row of at least three letters 'c'

egrep 'c{3,}' filename

The following example will match mobile number which is in the following format 91-1234567890 (i.e twodigit-tendigit)

grep "digit:\{2\}[ -]\?digit:\{10\}" filename

Treffer hervorheben

Use the following syntax:

grep --color regex filename

Nur Treffer, nicht Zeile anzeigen

Use the following syntax:

grep -o regex filename

Anhang

Siehe auch

Dokumentation

Man-Page
  • grep
  • regex(7)
Info-Pages
  • info page grep

Links

Projekt

Weblinks

Grafische Werkzeuge

Für den Einsatz innerhalb einer Desktop-Umgebung sind gedacht Searchmonkeyhttps://searchmonkey.embeddediq.com/