Zum Inhalt springen

Grep/Anwendung: Unterschied zwischen den Versionen

Aus Foxwiki
Markierung: Ersetzt
 
(72 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
'''Grep/Anwendung'''
'''Grep/Anwendung'''


== Beschreibung ==
== Arbeiten mit grep ==
=== Einfache Wortsuche ===
<syntaxhighlight lang="bash" highlight="1" line copy>
grep root /etc/passwd
</syntaxhighlight>
 
Zeigt alle Zeilen, die root in genau dieser Schreibweise enthalten
 
=== Suche nach Wortvariationen ===
; Ignoriert Groß-/Kleinschreibung
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -i Root /etc/passwd
</syntaxhighlight>
 
; Findet Zeilen die willi und willy enthalten
<syntaxhighlight lang="bash" highlight="1" line copy>
grep will[iy] /etc/passwd
</syntaxhighlight>
 
; Findet nicht willy nicht enthalten, aber willi, willo usw
<syntaxhighlight lang="bash" highlight="1" line copy>
grep will[^y] /etc/passwd
</syntaxhighlight>
 
=== Leere Zeilen entfernen ===
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -v '^$' /etc/services
</syntaxhighlight>
 
Wenn ein Zeilenende auf einen Zeilenanfang ^ folgt so werden leere Zeilen gefunden. -v invertiert die Ergebnisse und gibt Leerzeilen nicht aus
 
=== Kommentare filtern ===
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -v '^#' /etc/services
</syntaxhighlight>
 
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 ===
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -c '^#' /etc/services
</syntaxhighlight>
 
Gibt die Anzahl der Kommentarzeilen in der Datei an
 
=== Treffer im Zusammenhang sehen ===
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -C2 NFS /etc/services
</syntaxhighlight>
 
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 ===
<syntaxhighlight lang="bash" highlight="1" line copy>
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
</syntaxhighlight>
 
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)?
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -c ':[0-9]\{1,\}:100:' /etc/passwd
9
</syntaxhighlight>
 
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:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -c ':[[:digit:]]\{1,\}:100:' /etc/passwd
9
</syntaxhighlight>
 
=== Netzwerkdienste über UDP ===
Welche Netzwerkdienste über UDP sind auf unserem System verfügbar (Datei /etc/inetd.conf)?
<syntaxhighlight lang="bash" highlight="1" line copy>
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
</syntaxhighlight>
 
* 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 [https://eaumleitung.htm/#pipes Pipes] einleuchtender sein
 
Das Ergebnis aus obigen Beispiel erhält man auch mit folgender Befehlsfolge:
<syntaxhighlight lang="bash" highlight="1" line copy>
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
</syntaxhighlight>
 
== 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:
# die Kurzform, ein Minuszeichen und direkt dahinter der Optionsbuchstabe
* 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 ===
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


== Anwendung ==
ohne -v
<syntaxhighlight lang="bash" highlight="1" line>
<syntaxhighlight lang="bash" highlight="1" line copy>
$ ps ax | grep inetd
133 ? S 0:00 /usr/sbin/inetd
762 pts/2 S 0:00 grep inetd
</syntaxhighlight>
</syntaxhighlight>


=== Problembehebung ===
die Ausgabe "grep" herausfiltern
 
<syntaxhighlight lang="bash" highlight="1" line copy>
ps ax | grep inetd | grep -v grep
133 ? S 0:00 /usr/sbin/inetd
</syntaxhighlight>


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


=== Dateien ===
=== -i ===
{| class="wikitable options"
Groß- und Kleinschreibung werden nicht unterschieden
<syntaxhighlight lang="bash" highlight="1" line copy>
$ grep -i ROot /etc/passwd
root:x:0:0:root:/root:/bin/bash
</syntaxhighlight>
 
=== 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)
<syntaxhighlight lang="bash" highlight="1" line copy>
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
</syntaxhighlight>
 
== Beispiele ==
{| class="wikitable options big"
|-
! 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
|-
|-
! Datei !! Beschreibung
| 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
|}
|}
=== Weitere Beispiele ===
==== In einer bestimmten Datei nach einem Wort suchen ====
<syntaxhighlight lang="bash" highlight="1" line copy>
grep suchwort datei.txt
</syntaxhighlight>
==== Alle Dateien im aktuellen Ordner und Unterordnern, die einen bestimmten Text enthalten ====
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -R "suchwort" *
</syntaxhighlight>
==== Dateien im aktuellen Ordner, die wort1 oder wort2 im Inhalt haben ====
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -E "(wort1|wort2)" *
</syntaxhighlight>
==== Dateien in Unterordner ====
<syntaxhighlight lang="bash" highlight="1" line copy>
egrep -rni -e "ubuntuusers" /var/www
</syntaxhighlight>
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 ====
<syntaxhighlight lang="bash" highlight="1" line copy>
egrep -rc -e "toll" /usr/src
</syntaxhighlight>
* Gibt an, wie oft (Option -c) die Zeichenkette toll in welchen Dateien im Verzeichnis /usr/src vorkommt
==== Fehler in Log-Datei ====
<syntaxhighlight lang="bash" highlight="1" line copy>
egrep -w "EE|WW" /var/log/Xorg.0.log
</syntaxhighlight>
* 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
==== Binärdateien nicht durchsuchen ====
<syntaxhighlight lang="bash" highlight="1" line copy>
</syntaxhighlight>
grep -rIo "\-session" ~
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...),
* 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 ====
<syntaxhighlight lang="bash" highlight="1" line copy>
</syntaxhighlight>
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
=== 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:
<syntaxhighlight lang="bash" highlight="1" line copy>
egrep 'floppy|cdrom' /etc/fstab
/dev/hdc /cdrom iso9660 ro,noauto,user,exec 0 0
/dev/fd0 /floppy auto noauto,user 0 0
</syntaxhighlight>
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:
<syntaxhighlight lang="bash" highlight="1" line copy>
cat beispiel.txt
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum
</syntaxhighlight>
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:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep "ein[[:space:]][[:space:]]
</syntaxhighlight>
Zwischenraum" beispiel.txt
<syntaxhighlight lang="bash" highlight="1" line copy>
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum
</syntaxhighlight>
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:
<syntaxhighlight lang="bash" highlight="1" line copy>
egrep "ein[[:space:]]+Zwischenraum" beispiel.txt
1 ein Zwischenraum
2 ein Zwischenraum
3 ein Zwischenraum
4 ein Zwischenraum
</syntaxhighlight>
<noinclude>
<noinclude>


== Anhang ==
== Reguläre Ausdrücke in grep ==
=== Siehe auch ===
Unter Linux wird GNU grep genutzt, dass Erweiterte Reguläre ausdrücke unterstüzt
{{Special:PrefixIndex/{{BASEPAGENAME}}}}
* 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
<syntaxhighlight lang="bash" highlight="" line>
^w1
w1|w2
[^ ]
</syntaxhighlight>
 
=== Reguläre Ausdrücke für grep ===
Suche nach 'vivek' in /etc/passswd
<syntaxhighlight lang="bash" highlight="1" line copy>
grep vivek /etc/passwd
</syntaxhighlight>
 
Beispielausgabe:
<syntaxhighlight lang="bash" highlight="" line>
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
</syntaxhighlight>
 
Suche in Groß- und Kleinschreibung
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -i -w vivek /etc/passwd
</syntaxhighlight>
 
Suche nach 'vivek' oder 'raj' in Groß- und Kleinschreibung
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -E -i -w 'vivek|raj' /etc/passwd
</syntaxhighlight>
 
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:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep ^vivek /etc/passwd
</syntaxhighlight>
 
Sample outputs:
<syntaxhighlight lang="bash" highlight="" line >
vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh
</syntaxhighlight>
 
You can display only lines starting with the word vivek only i.e. do not display vivekgite, vivekg etc:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -w ^vivek /etc/passwd
</syntaxhighlight>
 
Find lines ending with word foo:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep 'foo$' filename
</syntaxhighlight>
 
Match line only containing foo:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep '^foo$' filename
</syntaxhighlight>
 
You can search for blank lines with the following examples:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep '^$' filename
</syntaxhighlight>
 
=== Zeichenklassen ===
Match Vivek or vivek:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep '[vV]ivek' filename
</syntaxhighlight>
OR
<syntaxhighlight lang="bash" highlight="1" line copy>
grep '[vV][iI][Vv][Ee][kK]' filename
</syntaxhighlight>
 
You can also match digits (i.e match vivek1 or Vivek2 etc):
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -w '[vV]ivek[0-9]' filename
</syntaxhighlight>
 
You can match two numeric digits (i.e
* match foo11, foo12 etc):
 
<syntaxhighlight lang="bash" highlight="1" line copy>
grep 'foo[0-9][0-9]' filename
</syntaxhighlight>
 
You are not limited to digits, you can match at least one letter:
 
<syntaxhighlight lang="bash" highlight="1" line copy>
grep '[A-Za-z]' filename
</syntaxhighlight>
 
Display all the lines containing either a "w" or "n" character:
 
<syntaxhighlight lang="bash" highlight="1" line copy>
grep [wn] filename
</syntaxhighlight>
 
=== bracket expression ===
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
{| class="wikitable options big"
|-
| [: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'
|}
 
; Beispiel
In this example match all upper case letters
<syntaxhighlight lang="bash" highlight="1" line copy>
grep '[:upper:]' filename
</syntaxhighlight>
 
=== 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":
<syntaxhighlight lang="bash" highlight="1" line copy>
grep '\<b.t\>' /etc/services
</syntaxhighlight>
 
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 ====
<syntaxhighlight lang="bash" highlight="1" line copy>
grep '^..$' filename
</syntaxhighlight>
 
==== Display any lines starting with a dot and digit ====
<syntaxhighlight lang="bash" highlight="1" line copy>
grep '^\.[0-9]' filename
</syntaxhighlight>
 
=== Den Punkt maskieren ===
The following regex to find an IP address 192.168.1.254 will not work:
 
<syntaxhighlight lang="bash" highlight="1" line copy>
grep '192.168.1.254' /etc/hosts
</syntaxhighlight>
 
All three dots need to be escaped:
 
<syntaxhighlight lang="bash" highlight="1" line copy>
grep '192\.168\.1\.254' /etc/hosts
</syntaxhighlight>
 
The following example will only match an IP address:
 
<syntaxhighlight lang="bash" highlight="1" line copy>
egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' filename
</syntaxhighlight>
 
The following will match word Linux or UNIX in any case:
 
<syntaxhighlight lang="bash" highlight="1" line copy>
egrep -i '^(linux|unix)' filename
</syntaxhighlight>
 
=== Führender Bindestrich ===
Searches for all lines matching '--test--' using -e option Without -e, grep would attempt to parse '--test--' as a list of options:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -e '--test--' filename
</syntaxhighlight>
 
=== Oder-Verknüpfung ===
Use the following syntax:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep 'word1|word2' filename
</syntaxhighlight>
 
OR
<syntaxhighlight lang="bash" highlight="1" line copy>
grep 'word1\|word2' filename
</syntaxhighlight>
 
=== UND-Verknüpfung ===
Use the following syntax to display all lines that contain both 'word1' and 'word2'
<syntaxhighlight lang="bash" highlight="1" line copy>
grep 'word1' filenae | grep 'word2'
</syntaxhighlight>
 
=== Sequenzen ===
You can test how often a character must be repeated in sequence using the following syntax:
<syntaxhighlight lang="bash" highlight="" line>
{N}
{N,}
{min,max}
</syntaxhighlight>
 
Match a character "v" two times:
<syntaxhighlight lang="bash" highlight="1" line copy>
egrep "v{2}" filename
</syntaxhighlight>
 
The following will match both "col" and "cool":
<syntaxhighlight lang="bash" highlight="1" line copy>
egrep 'co{1,2}l' filename
</syntaxhighlight>
 
The following will match any row of at least three letters 'c'
<syntaxhighlight lang="bash" highlight="1" line copy>
egrep 'c{3,}' filename
</syntaxhighlight>
 
The following example will match mobile number which is in the following format 91-1234567890 (i.e twodigit-tendigit)
<syntaxhighlight lang="bash" highlight="1" line copy>
grep "[[:digit:]]\{2\}[ -]\?[[:digit:]]\{10\}" filename
</syntaxhighlight>
 
=== Treffer hervorheben ===
Use the following syntax:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep --color regex filename
</syntaxhighlight>
 
=== Nur Treffer, nicht Zeile anzeigen ===
Use the following syntax:
<syntaxhighlight lang="bash" highlight="1" line copy>
grep -o regex filename
</syntaxhighlight>
 
== Ausgabe anpassen ==
=== Treffer einfärben ===
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
 
==== --color ====
Hebt Treffer farblich hervor
 
==== Per default ====
===== --color // bashrc alias? =====
Ich habe das per Default in meiner .bashrc/.zshrc
* Wenn du dies auch willst, musst du nur die Zeile
 
export GREP_OPTIONS='--color=auto'
 
in deiner Shell-Config-File einfügen
* Falls dir die Farbe nicht gefällt, kannst du sie per
 
export GREP_COLOR='1;32'
 
nach Belieben ändern
* Für eine andere Farbe einfach einen der Farbcodes in den Hochkommata ersetzen
 
Black 0;30 Dark Gray 1;30
Blue 0;34 Light Blue 1;34
Green 0;32 Light Green 1;32
Cyan 0;36 Light Cyan 1;36
Red 0;31 Light Red 1;31
Purple 0;35 Light Purple 1;35
Brown 0;33 Yellow 1;33
Light Gray 0;37 White 1;37
 
=== Trefferanzahl anzeigen ===
Die Anzahl aller Zeilen, die das Suchmuster beinhalten, kannst du dir mit -c oder -count ausgeben lassen
* Damit liefert grep die reine Anzahl, also beispielsweise "4″ für 4 Treffer zurück, sonst nichts
 
==== -c ====
Anzeige der Anzahl Zeilen, in denen das Muster gefunden wurde
 
$ grep -c bash /etc/passwd
38
 
=== Zeilennummer anzeigen ===
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
 
=== -n ===
Zeigt die Zeilennummer an, in der das Muster gefunden wurde
 
$ grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
 
=== Nur Dateinamen ausgeben lassen ===
Manchmal braucht man nur den/die Dateinamen, in denen der Suchstring gefunden wurde
* Das kannst du über die Option -l (kleines "L") erreichen
 
=== -l ===
Nur Anzeige der Namen der Dateien, in denen das Muster gefunden wurde
 
$ grep -l tcp /etc/host*
/etc/hosts.allow
/etc/hosts.deny
 
=== Dateinamen ohne Treffer ===
=== -L ===
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
 
=== Kontext anzeigen ===
=== -A [Anzahl] ===
Zeigt Anzahl Zeilen an, die der Zeile mit dem Muster folgen
 
grep -A 2 root /etc/passwd
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


==== Dokumentation ====
=== Ausgabe unterdrücken ===
=== -s ===
Unterdrückt die Fehlerausgaben (Standardfehler); sinnvoll in Skripten


; Man-Page
=== Muster aus Datei laden ===
Wer komplexer Suchmuster immer wieder verwendet, kann diese in Dateien speichern und im grep-Befehl per ''-f regexdatei'' einbinden


; Info-Pages
=== Beispiel ===
alle Zeilen mit Emailadressen aus einer Datei filtern


==== Links ====
grep -E '([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})' datei.txt
===== Projekt =====


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


{{DEFAULTSORT:new}}
Nun kannst du den Regular expression im obigen Beispiel mit dem File ersetzen:
{{DISPLAYTITLE:new}}


[[Kategorie:new]]
grep -Ef ~/snippets/regexes/email datei.txt


</noinclude>
Tipp


= TMP =
Mach es dir zur Gewohnheit, immer alle Regular expressiones, die du verwendest, unter einem aussagekräftigen Dateinamen in einem bestimmten Verzeichnis zu speichern
== Quellen ==
* So sammelst du mit der Zeit ein komfortables, wiederverwendbares Regular expression-Kompendium
* man page grep and regex(7)
* info page grep


=== Links ===
== Anhang ==
* [http://wiki.ubuntuusers.de/pgrep pgrep] - gezielt nach der PID suchen / filternhttp://wiki.ubuntuusers.de/pgrep
=== Siehe auch ===
* [http://wiki.ubuntuusers.de/pdfgrep pdfgrep] - PDF-Dateien durchsuchenhttp://wiki.ubuntuusers.de/pdfgrep
{{Special:PrefixIndex/grep}}
* [http://de.wikipedia.org/wiki/grep grep in der Wikipedia]http://de.wikipedia.org/wiki/grep
* [http://www.gnu.org/software/grep/ GNU grep]http://www.gnu.org/software/grep/
* [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


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


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


{{DISPLAYTITLE:grep}}
</noinclude>

Aktuelle Version vom 8. Oktober 2025, 23:11 Uhr

Grep/Anwendung

Arbeiten mit grep

Einfache Wortsuche

grep root /etc/passwd

Zeigt alle Zeilen, die root in genau dieser Schreibweise enthalten

Suche nach Wortvariationen

Ignoriert Groß-/Kleinschreibung
grep -i Root /etc/passwd
Findet Zeilen die willi und willy enthalten
grep will[iy] /etc/passwd
Findet nicht willy nicht enthalten, aber willi, willo usw
grep will[^y] /etc/passwd

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



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

bracket expression

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

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

Führender 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

Use the following syntax:

grep 'word1|word2' filename

OR

grep 'word1\|word2' filename

UND-Verknüpfung

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

grep 'word1' filenae | grep 'word2'

Sequenzen

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

Ausgabe anpassen

Treffer einfärben

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

--color

Hebt Treffer farblich hervor

Per default

--color // bashrc alias?

Ich habe das per Default in meiner .bashrc/.zshrc

  • Wenn du dies auch willst, musst du nur die Zeile
export GREP_OPTIONS='--color=auto'

in deiner Shell-Config-File einfügen

  • Falls dir die Farbe nicht gefällt, kannst du sie per
export GREP_COLOR='1;32'

nach Belieben ändern

  • Für eine andere Farbe einfach einen der Farbcodes in den Hochkommata ersetzen
Black 0;30 Dark Gray 1;30
Blue 0;34 Light Blue 1;34
Green 0;32 Light Green 1;32
Cyan 0;36 Light Cyan 1;36
Red 0;31 Light Red 1;31
Purple 0;35 Light Purple 1;35
Brown 0;33 Yellow 1;33
Light Gray 0;37 White 1;37

Trefferanzahl anzeigen

Die Anzahl aller Zeilen, die das Suchmuster beinhalten, kannst du dir mit -c oder -count ausgeben lassen

  • Damit liefert grep die reine Anzahl, also beispielsweise "4″ für 4 Treffer zurück, sonst nichts

-c

Anzeige der Anzahl Zeilen, in denen das Muster gefunden wurde

$ grep -c bash /etc/passwd
38

Zeilennummer anzeigen

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

-n

Zeigt die Zeilennummer an, in der das Muster gefunden wurde

$ grep -n root /etc/passwd
1:root:x:0:0:root:/root:/bin/bash

Nur Dateinamen ausgeben lassen

Manchmal braucht man nur den/die Dateinamen, in denen der Suchstring gefunden wurde

  • Das kannst du über die Option -l (kleines "L") erreichen

-l

Nur Anzeige der Namen der Dateien, in denen das Muster gefunden wurde

$ grep -l tcp /etc/host*
/etc/hosts.allow
/etc/hosts.deny

Dateinamen ohne Treffer

-L

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

Kontext anzeigen

-A [Anzahl]

Zeigt Anzahl Zeilen an, die der Zeile mit dem Muster folgen

grep -A 2 root /etc/passwd
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

Anhang

Siehe auch