Grep/Anwendung
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, z. B.
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 z. B. 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:
- 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, z. B. -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
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
- pgrep - gezielt nach der PID suchen / filternhttp://wiki.ubuntuusers.de/pgrep
- pdfgrep - PDF-Dateien durchsuchenhttp://wiki.ubuntuusers.de/pdfgrep
- grep in der Wikipediahttp://de.wikipedia.org/wiki/grep
- GNU grephttp://www.gnu.org/software/grep/
- Erklärung regulärer Ausdrückehttp://de.wikipedia.org/wiki/Regulärer_Ausdruck
Grafische Werkzeuge
Für den Einsatz innerhalb einer Desktop-Umgebung sind gedacht Searchmonkeyhttp://searchmonkey.embeddediq.com/
- regexxer http://regexxer.sourceforge.net/
- jGrep http://sourceforge.net/projects/jgrep
- grepuihttp://sethoscope.net/grepui/