Login
Newsletter
Mi, 6. Januar 2016, 14:00

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'

  • Das Werk darf vervielfältigt, verbreitet und öffentlich zugänglich gemacht werden, Abwandlungen und Bearbeitungen des Werkes müssen unter den gleichen Bedingungen weitergegeben werden. Der Name des Autors/Rechteinhabers muss in der von ihm festgelegten Weise genannt werden.

    - Weitere Informationen
Kommentare (Insgesamt: 10 || Alle anzeigen )
Re[2]: GREP_OPTIONS deprecated (bluescream?, Mo, 8. Februar 2016)
grep option '-l' (Xk2c, So, 10. Januar 2016)
Re[4]: GREP_OPTIONS deprecated (Richtig, aber, Do, 7. Januar 2016)
Re: GREP_OPTIONS deprecated (kbdcalls, Do, 7. Januar 2016)
Re[3]: GREP_OPTIONS deprecated (ms123, Mi, 6. Januar 2016)
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten