Aus Linux-Magazin 05/2020

Das bessere Grep: Textmustersuche mit Ack

© macor, 123RF

Die Suche nach Textmustern in Dateien gehört zu den häufigsten Aufgaben, die der Admin auf der Kommandozeile löst – meist mittels des Standardtools Grep. Dasselbe lässt sich aber auch sehr viel komfortabler erledigen, mit Ack, einem raffinierten Perl-Skript.

Ein großer Vorteil von Ack [1] wird schon bald klar, nämlich wenn man nicht nur ein Verzeichnis, sondern einen Verzeichnisbaum durchsuchen möchte. Grep kann das nicht aus eigener Kraft, man muss es für diesen Zweck beispielsweise mit Find kombinieren. Das führt zu unübersichtlicheren und auch tippfehleranfälligen Kommando-Pipelines.

Ack dagegen durchwandert den Verzeichnisbaum selbstständig und dehnt die Suche auf alle Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen aus. Die erste Zeile aus Listing 1 sucht zum Beispiel vom aktuellen Verzeichnis ausgehend in allen Unterverzeichnisse nach Files, die die Shebang-Zeile eines Perl-Skripts enthalten.

Listing 1

Aufrufbeispiele

$ ack '#!/usr/bin/perl' .
$ ack -f --shell .
$ ack --perl @.*\\[.*\\] .

Anders als bei Grep erzeugen Verzeichniseinträge, an denen die Suche vorbeikommt, keine Fehlermeldungen. Auch ohne besonderen Optionen zeigt Ack die Treffer mit Pfad und Dateinamen sowie farblich hervorgehoben an.

Suche nach und in Files

Bei der Suche nach Perl-Skripts hätte man alternativ auch nach der Dateiendung ».pl« suchen können, und auch dabei kommt Ack dem Anwender entgegen: Es kennt nämlich für genau diesen Zweck nicht nur die Schalter »–perl« (und »–noperl«), sondern noch Dutzende andere für C-, Erlang-, Ruby-, Python- oder Java-Files und viele andere. Dabei kann es außerdem mehrere Endungen einem Typ zuordnen. So findet »–shell« Bourne-Shell, C-Shell, Korn-Shell, Z-Shell oder Bash-Skripts und noch etliche mehr.

Diese Filter kann man entweder benutzen, um die Mustersuche auf entsprechende Dateien einzuschränken, oder auch, um die ausgefilterten Files aufzulisten – etwa alle Shell-Skripte, gleich welchen Dialekts. Dabei unterdrückt die Option »-f« die Mustersuche in den gefundenen Files (Listing 1, zweite Zeile).

Vorbild Grep

Ack kennt dieselben Optionen wie Grep kennt und benennt sie auch identisch, sodass man nicht umlernen muss. So lassen sich zum Beispiel eine Anzahl Zeilen vor und nach dem Treffer anzeigen (Kontext), Groß- und Kleinschreibung ignorieren, Zeilennummern ausgeben, das Suchergebnis invertieren, die Treffer zählen und so weiter.

Die Suchmuster selbst gibt der Nutzer in Form regulärer Ausdrücke vor. Perl-Arrays (mit »@« beginnender Name, gefolgt von einem Ausdruck in eckigen Klammern) findet etwa das Kommando aus der letzten Zeile von Listing 1. Wer beim Programmaufruf viele Optionen kombinieren will, der kann sie auch in einer Datei ablegen, statt sie auf der Kommandozeile einzutippen. Mittels »–ackrc=Datei« spezifiziert man dieses File; eine Vorlage erzeugt »–create-ackrc«.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 1 HeftseitePreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
2 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
bash-eur
6 Jahre her

“Grep kann das nicht aus eigener Kraft, man muss es für diesen Zweck beispielsweise mit Find kombinieren.”

Bei Debian zeigt man grep
[…]
-r, –recursive
Read all files under each directory, recursively, following symbolic links only if they are on the command line. Note
that if no file operand is given, grep searches the working directory. This is equivalent to the -d recurse option.

-R, –dereference-recursive
Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
[…]

Was ist an “ack” jetzt soviel besser?

Nach oben