Unerwünschte grep-Ausgaben vermeiden
Selbst aus altbekannten Programmen kann man oft noch einiges mehr herausholen - man muss sich nur einmal gründlich mit ihnen auseinandersetzen.
Wer hat das noch nicht erlebt: Man möchte mal schnell wissen, ob eine bestimmte Zeichenfolge, beispielsweise ein Name, in einer Datei im Verzeichnis /etc vorkommt (und natürlich, in welcher). Natürlich benutzt man dafür keinen Dateimanager und erst recht keine Desktop-Suche, sondern das traditionelle grep
, weil's einfach viel schneller und effektiver ist. Doch das Ergebnis ist nicht ganz wie erwünscht, sondern es versteckt sich zwischen einem Wust von Ausgaben nach dem Muster:
grep: /etc/acpi: Ist ein Verzeichnis
Wie nicht anders zu erwarten, gibt es eine Reihe von Bordmitteln, um die unerwünschten Ausgaben zu unterdrücken, die den Blick aufs Wesentliche verstellen. Hier zeigen wir eine Kommandozeilenoption von grep und eine Shell-Funktionalität, geordnet nach der Länge der zu tippenden Eingabe:
grep -s samba /etc/* grep samba /etc/* 2> /dev/null grep -d skip -D skip samba /etc/*
Der Effekt ist in allen drei Fällen derselbe, sofern man GNU Grep und eine POSIX-Shell nutzt. Doch es gibt Unterschiede, wenn man eine andere Implementation von grep (die traditionelle Unix-Variante, eine BSD-Variante oder gar eine selbstgeschriebene) nutzt. Am portabelsten ist das Konstrukt 2>
(3. Zeile), das einfach die grep-Warnungen in die Tonne umleitet, es erfordert aber leider die meiste Tipparbeit.
Von den beiden oben angegebenen Optionen ist -s
laut der grep-Manpage POSIX-konform und wird somit auf allen POSIX-Konformen Systemen funktionieren. Kein Glück hat man dagegen bei alten grep-Versionen. Einige ältere Implementationen kennen die Option gar nicht, bei anderen wirkt sie wie -q
(genau das Umgekehrte des erwünschten Verhaltens). Die Option -d skip -D skip
hingegen gibt es nur bei GNU Grep, und es könnte immer noch Fälle geben, wo -s
still ist, die längeren Optionen dagegen nicht.
Insgesamt kann man also sagen, dass es auf einem Linux-System ziemlich egal ist, welche Variante man wählt. Die Verzeichnis-Meldung wird übrigens auch unterdrückt, wenn man die Option -R
oder -r
zum rekursiven Suchen (mit bzw. ohne Folgen von symbolischen Links) verwendet.
Wie immer gilt: Wenn man eine spezifische Art des Aufrufs häufig verwendet, sollte man nicht zögern, eine Shell-Funktion dafür zu schreiben und in seinem Profil speichern, um möglichst wenig tippen zu müssen. Beispielsweise könnte man eine lautlose Version von grep so definieren:
lg() { grep -s $*; }
Und rekursiv wäre das folgende denkbar:
rg() { grep -R -s $*; }
In beiden Fällen werden alle angegebenen Parameter mittels $*
an grep übergeben, so dass nichts an Flexibilität verloren geht. Der Vollständigkeit halber soll auch noch erwähnt werden, dass man Optionen an GNU Grep mit der Umgebungsvariable GREP_OPTIONS
übergeben kann. In einem Skript würde man das folgendermaßen nutzen:
export GREP_OPTIONS='-d skip -D skip'