Weiterlesen mit NEWS. Jetzt testen.
Lesezeit ca. 7 Min.

Ugrep: Effizienter suchen mit Ugrep: Aufgespürt


LinuxUser - epaper ⋅ Ausgabe 1/2021 vom 17.12.2020

Beim Standard-Befehl Grep gab es lange keine wesentlichen Neuerungen mehr. Ugrep bringt nun Schwung in die Angelegenheit.


Artikelbild für den Artikel "Ugrep: Effizienter suchen mit Ugrep: Aufgespürt" aus der Ausgabe 1/2021 von LinuxUser. Dieses epaper sofort kaufen oder online lesen mit der Zeitschriften-Flatrate United Kiosk NEWS.

Bildquelle: LinuxUser, Ausgabe 1/2021

README
Das Suchen von Texten in Dateien oder Datenströmen ist eine häufige und entsprechend wichtige Funktion. Ugrep löst diese Aufgabe schnell, effizient und bei Bedarf sogar interaktiv.

Grep gehört zu den ältesten Unix-Befehlen überhaupt. Das Kürzel steht für Global/ Regular Expression/ Print oder Global search for a Regular Expression and Print out matched lines. Es greift die Syntax des ursprünglichen Unix-Editors Qed auf, der mittels g/re/p Muster in Textdateien suchte. Neben ...

Weiterlesen
epaper-Einzelheft 5,99€
NEWS Jetzt gratis testen
Bereits gekauft?Anmelden & Lesen
Leseprobe: Abdruck mit freundlicher Genehmigung von LinuxUser. Alle Rechte vorbehalten.
Lesen Sie jetzt diesen Artikel und viele weitere spannende Reportagen, Interviews, Hintergrundberichte, Kommentare und mehr aus über 1000 Magazinen und Zeitungen. Mit der Zeitschriften-Flatrate NEWS von United Kiosk können Sie nicht nur in den aktuellen Ausgaben, sondern auch in Sonderheften und im umfassenden Archiv der Titel stöbern und nach Ihren Themen und Interessensgebieten suchen. Neben der großen Auswahl und dem einfachen Zugriff auf das aktuelle Wissen der Welt profitieren Sie unter anderem von diesen fünf Vorteilen:

  • Schwerpunkt auf deutschsprachige Magazine
  • Papier sparen & Umwelt schonen
  • Nur bei uns: Leselisten (wie Playlists)
  • Zertifizierte Sicherheit
  • Freundlicher Service
Erfahren Sie hier mehr über United Kiosk NEWS.

Mehr aus dieser Ausgabe

Titelbild der Ausgabe 1/2021 von Garuda Linux: Garuda Linux: Innovativer Allrounder aus Indien: Flexibles Fabelwesen. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Garuda Linux: Garuda Linux: Innovativer Allrounder aus Indien: Flexibles Fabelwesen
Titelbild der Ausgabe 1/2021 von Angetestet. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Angetestet
Titelbild der Ausgabe 1/2021 von Bash vs. Zsh: Die zwei beliebtesten Shells im Direktvergleich: Bourne Again Shell vs. Z-Shell: Kopf-an-Kopf-Rennen. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Bash vs. Zsh: Die zwei beliebtesten Shells im Direktvergleich: Bourne Again Shell vs. Z-Shell: Kopf-an-Kopf-Rennen
Titelbild der Ausgabe 1/2021 von Aalib/ Libcaca: Bilder im Terminal und in Webseiten als Text darstellen: Eingebildet. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Aalib/ Libcaca: Bilder im Terminal und in Webseiten als Text darstellen: Eingebildet
Titelbild der Ausgabe 1/2021 von Daten löschen: Daten sicher löschen: Radierer für Daten. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Daten löschen: Daten sicher löschen: Radierer für Daten
Titelbild der Ausgabe 1/2021 von Screenwriting: Drehbücher mit Linux schreiben: Voll das Drama. Zeitschriften als Abo oder epaper bei United Kiosk online kaufen.
Screenwriting: Drehbücher mit Linux schreiben: Voll das Drama
Vorheriger Artikel
Angetestet
aus dieser Ausgabe
Nächster Artikel Bash vs. Zsh: Die zwei beliebtesten Shells im Direktvergleich: Bo…
aus dieser Ausgabe

... festen Suchwörtern kann es dabei auch Muster mit Joker-Zeichen suchen. Unter Linux wird normalerweise GNU Grep installiert. Es erweitert die Eigenschaften des ursprünglichen Grep an einigen Stellen, wie beispielsweise bei der rekursiven Suche in Verzeichnissen.

Eine andere Variante von Grep, Agrep (approximatives Grep), erweitert die Textsuche um eine unscharfe Suche. Sie findet auch Beinahe-Treffer, sofern die Unterschiede unter einer vorgegebenen Schwelle liegen, dem sogenannten Wortabstand.

Der errechnet sich aus den notwendigen Vertauschungen, Löschungen und Hinzufügungen von Buchstaben, die das Suchmuster in das tatsächliche Datum umwandeln.

Zusätzlich gibt es einige Varianten von Grep, die Suchmuster auch in bestimmten Archivtypen finden, beispielsweise in ZIP-Dateien. Diese Programme arbeiten relativ langsam, da sie zunächst das Archiv entpacken müssen. Alle unter Linux verwendeten Grep-Varianten können zur Suche in Archiven aber auch Daten aus Pipes via Standardeingabekanal lesen und die Ergebnisse in den Standardausgabekanal schreiben (Listing 1).

Ugrep

All das, und noch einiges mehr, kann Ugrep , und zwar ohne das explizite Entpacken der Datenströme. Zusätzlich zeichnet sich das Programm durch eine ausgesprochen hohe Bearbeitungsgeschwindigkeit aus. Um die Suche zu beschleunigen, verwendet es bei Bedarf mehrere Threads.

Ugrep wird seit einigen Jahren in C++ entwickelt und steht nicht nur unter Linux zur Verfügung, sondern auch für andere Betriebssysteme. Suchmuster, die man als reguläre Ausdrücke angibt, dürfen sich auch über aufeinanderfolgende Zeilen erstrecken, was viele andere Grep-Varianten nicht beherrschen. Voreingestellt nimmt Ugrep für die durchsuchten Daten Unicode als Kodierung an.

Als Archivtypen unterstützt Ugrep Formate wie CPIO, JAR, PAX, TAR und ZIP, die mit allen gängigen Verfahren (BZIP, GZ, LZ, XZ) komprimiert sein dürfen. Zusätzlich gibt es mit sogenannten Filtern eine Möglichkeit, Daten in speziellen Formaten vorab aufzubereiten. Beispielsweise lassen sich PDF-Dokumente mithilfe eines Filters in Text umwandeln, den Ugrep dann durchsucht.

Wie alle Grep-Varianten wird das Programm maßgeblich durch Optionen gesteuert.

Für die meisten Optionen gibt es wie üblich eine Kurz- (‑O) und eine Langform (‑‑Option). Die Tabelle Ugrep: Wichtige Optionen fasst die wichtigsten Optionen zusammen.

Daneben schlägt der Entwickler eine Reihe von Alias-Konstrukten für die .bashrc vor, um unter anderem die Kompatibilität zu GNU Grep zu gewährleisten (Tabelle Vorgeschlagene Alias-Konstrukte).

Einige dieser Kurzformen setzen auf die Befehlsvariante ug. In dieser Form liest Ugrep eine Konfigurationsdatei ein (voreingestellt $HOME/.ugrep), die spezielle Einstellungen enthalten kann. Das erlaubt, wichtige Voreinstellungen implizit anzuwenden, ohne sie jedes Mal in der Befehlszeile angeben zu müssen.

Bei den Suchmustern unterstützt Ugrep mehrere Varianten, die Sie durch entsprechende Optionen aktivieren (siehe Kasten Muster). Neben einfachen und erweiterten regulären Ausdrücken, wie sie auch GNU Grep kennt, unterstützt Ugrep auch Perl-Regexe und Wortmuster.

Zusätzlich zu diesen Standardmustern, die immer Positiv-Muster definieren, kann Ugrep auch negative Muster (Ausschlussmuster) verwenden. Diese erlauben es beispielsweise, Treffer zu ignorieren, wenn sie in Kommentaren auftreten.

Auch Dateien, deren Namen einem bestimmten Muster entsprechen, lassen sich von der Suche ausschließen. Die Option ‑‑not wirkt speziell: Alle rechts von ihr stehenden Muster verwendet Ugrep als Ausschlussmuster.

Erweiterungen

An vielen Stellen erweitert Ugrep die anderen, klassischen Programmversionen. Besonders interessant sind dabei die neuen Features bei den Mustern in den Dateinamen („Globbing“). So steht **/ für beliebig viele - auch null - Verzeichnisse. Am Ende einer Pfaddefinition steht /** analog für beliebig viele Dateien. Der Spezialfall \\? adressiert null oder ein Zeichen.

In der Manpage fasst der Abschnitt GLOBBING diese Features zusammen und führt auch zahlreiche Beispiele an.

Spezielle Umgebungsvariablen erlauben, das Verhalten von Ugrep zusätzlich zu steuern. $GREP_PATH vereinfacht den Zugriff auf sogenannte Pattern Files, also Dateien, die Suchmuster definieren; die Option ‑f aktiviert dieses Feature. Muster in externen Dateien sind ein gutes Mittel, um komplexe Suchmuster dauerhaft vorzuhalten.

Einige Optionen, insbesondere ‑Q, können einen externen Editor aktivieren, den die Tastenkombination [Strg]+[Y] startet.

Ist die Umgebungsvariable $GREP_EDIT gesetzt, verwendet Ugrep den dort festgelegten Editor, ansonsten den in $EDITOR definierten. In den Umgebungsvariablen $GREP_COLOR und $GREP_COLORS legen Sie bei Bedarf fest, wann und wie Ugrep bei Verwendung der Option ‑‑color Treffer farbig hervorhebt. Näheres dazu beschreibt der Abschnitt GREP_ COLORS in der Manpage.

Als wirklich herausragende Erweiterung von Ugrep stechen aber die inkrementelle Suche beziehungsweise das sogenannte User Interface ins Auge.

User Interface

Grep-Programme setzt man normalerweise interaktiv in Befehlszeilen, Skripten oder Pipes ein; in vielen Fällen dienen die Ergebnisse dann als Eingaben für weitere Befehle. Das klappt so auch uneingeschränkt mit Ugrep. Zusätzlich legt der Entwickler aber auch ein großes Augenmerk auf eine erweiterte interaktive Nutzbarkeit.

So stellt die inkrementelle Suche derzeit ein absolutes Alleinstellungsmerkmal von Ugrep dar. Das dafür eingesetzte User Interface wurde Editoren wie Emacs nachempfunden und ist normalerweise GUI-Programmen vorbehalten.

Bei dieser Form der Suche verfeinert jeder zusätzlich angegebene Buchstabe die Suche weiter und reduziert die Anzahl der Treffer. Als Treffer erscheinen dann alle Zeilen, die mit den bisherigen Angaben übereinstimmen. Für diese Form der Suche stellt Ugrep ein spezielles Interface bereit, die Sie über die Option ‑Q aktivieren.

Als Argument können Sie eine kleine Zeitspanne angeben, die Ugrep wartet, bevor es die Eingaben auswertet.

In der linken oberen Ecke des Terminals erscheint nun der Prompt Q>. Alles, was Sie eintippen, interpretiert Ugrep als Suchmuster, jeder zusätzliche Tastendruck verfeinert die Suche. Dabei lassen sich sogar Tippfehler mit der Rückschritttaste korrigieren. Im Beispiel aus Abbildung 1 haben wir Ugrep mit den Optionen ‑ZQ (unscharf, interaktiv) aufgerufen und nach „alles“ gesucht. Aufgrund der unscharfen Suche findet Ugrep dabei auch „alpes“, „alls“, „ales“ und so weiter.

Dieser Modus ist so leistungsfähig, dass Ugrep damit manchmal sogar einen Pager zur Anzeige der Ausgaben ersetzen kann. So zeigt etwa man ugrep | ugrep ‑Q die Manpage von Ugrep an und erlaubt, ganz genau einzuschränken, welchen Suchbegriff es darstellen soll. Mit den Pfeiltasten lässt sich die Ausgabe dabei noch vertikal verschieben; [Esc] beendet den Modus wieder.

Obendrein lässt sich diese Option noch mit anderen kombinieren. Für den Fall, dass es nicht genügt, nur die Zeile mit dem Treffer zu sehen, fügen Sie der Ausgabe durch ‑C2 zwei sogenannte Kontextzeilen vor und nach dem Treffer hinzu.

In dieser Form ist Ugrep als Alias ( alias q2='ug ‑C2 ‑G '), Shell-Funktion oder Skript extrem nützlich.

Ähnliches gilt für die Möglichkeit, Archive zu durchsuchen. Viele moderne Dokumente liegen in komplexen Formaten wie EPUB, ODF etc. vor. Dort wirken die Optionen normalerweise nur auf Metadaten, die die Dokumenten-Container - oft ZIP-Archive - enthalten. Um in den eigentlichen Inhalten zu suchen, muss man diese Archive entpacken, was entweder ein Filter erledigt (dazu später mehr) oder die Option ‑z, oft gekoppelt mit ‑r für rekursiv.

Eine unscharfe Suche unterstützt Ugrep mit der Option ‑Z, optional gefolgt von einer ohne Leerzeichen direkt angehängten Zahl. Letztere bestimmt den Grad der Unschärfe, also die zulässige Anzahl der Fehler (ausgelassene, hinzugefügte, vertauschte Zeichen). Voreingestellt ist 1.

Größere Werte führen schnell zu vielen zusätzlichen Treffern, was die Ergebnisse aber manchmal unbrauchbar macht.

Allerdings lässt sich die Art der zulässigen Fehler festlegen: Mit einem Vorzeichen + oder ‑ bezieht sich die Angabe nur noch auf Hinzufügungen beziehungsweise Auslassungen. Die Tilde ~ fasst mehrere Fehler zusammen. Bei ‑Z~‑2 sind bis zu zwei Auslassungen oder Vertauschungen zulässig. Die Option ‑‑sort=best sortiert die Ausgaben so, dass die Files mit den besten Treffern zuerst erscheinen.

Einige Funktionstasten nutzt Ugrep im interaktiven Modus für besondere Aufgaben.

So aktiviert [F1] eine Online-Hilfe 2, in der Ugrep die aktuellen Tastenbindungen anzeigt. Sie können zusätzliche Optionen aktivieren, indem Sie sie in diesem Modus aufrufen. So aktiviert beispielsweise nach dem Drücken von [F1] die Tastenkombination [Alt-links]+ [Umschalt]+[Z] die unscharfe Suche.

1 Ugrep ermöglicht interaktive, unscharfe und inkrementelle Suchen.


2 Die Ugrep-Hilfe bringt praktischerweise gleich einen eingebauten Konfigurationsmodus mit.


Mit der Option ‑‑save‑config aufgerufen, erzeugt das Programm die Konfigurationsdatei $HOME/.ugrep. Bei Bedarf erzeugen Sie mit ‑‑save‑config=/Pfad/ Datei) eine andere Datei. Analog arbeitet ‑‑config beim Einlesen von Konfigurationsdateien.

Der Aufruf von Ugrep als ug liest die Konfiguration automatisch ein.

Da die Konfigurationsdateien ein mächtiges Mittel zum Steuern von Ugrep darstellen, gibt es auch noch die Kurzform ‑‑‑Datei für das Laden. Konfigurationsdateien mit bestimmten voreingestellten Optionen erzeugen Sie mit folgendem Befehl: $ ugrep ‑Option […] ‑‑save‑config Die Konfigurationsdateien sind gut kommentiert und lassen sich bei Bedarf mit einem Texteditor leicht anpassen.

Filter

Ugrep versucht, den Typ einer untersuchten Datei anhand der enthaltenen Daten, der Dateinamenserweiterung und der Signatur (dem „magic byte“) zu bestimmen. So lässt sich die Suche für bestimmte Dateitypen speziell vorbereiten, also quasi filtern.

Dabei extrahiert der Filter die Textbestandteile aus den Datenströmen.

Diese Filter führen einen Befehl, ein Skript beziehungsweise eine bestimmte Funktion aus, gegebenenfalls mit Pipes. Sie werden dem Suchprozess über die Option ‑‑filter=Filter oder ‑‑filter‑magic=Label:Magic- Byte vorgeschaltet.

In der Form ‑‑filter=Filter besteht der Filter aus einem Ausdruck der Form Ext:Befehlszeile. Bei Ext handelt es sich um eine durch Kommas getrennte Liste von Dateinamenserweiterungen, für die der Filter gelten soll, etwa .doc,. docx,.xls. Einen Sonderfall stellt * dar, das auf alle Dateien wirkt, insbesondere auf solche, für die es keine anderen Filter gibt.

Die Befehlszeile muss so konstruiert sein, dass sie Eingaben via Standardeingabekanal liest und die Ergebnisse in den Standardausgabekanal schreibt. Zu den typischen Befehlen zählen cat (alles weiterreichen) und head (die ersten Textzeilen weiterreichen), aber auch Werkzeuge wie exiftool (Metadaten extrahieren und weitergeben) oder pdftotext (Text aus PDFs extrahieren) lassen sich so einbinden.

Manche Befehle, wie pdftotext, benötigen Optionen um korrekt zu arbeiten - in diesem Fall pdftotext % ‑. Leerzeichen in den Befehlszeilen müssen Sie dann durch Hochkommas schützen: ‑‑filter='pdf:pdftotext % ‑' Die Option ‑‑filter‑magic‑label=Label: Magic erlaubt, den Filtermechanismus auf Datenströme zu erweitern, die Ugrep dann via Magic Byte klassifiziert.

Details dazu verrät die Manpage .

Mehrere Filter lassen sich durch Kommas getrennt angeben. Eine kombinierte Definition für PDF- und Office-Dokumente könnte so aussehen wie in Listing 3.

Fazit

Ugrep gehört auf jeden Rechner. Es ersetzt und ergänzt die Standardbefehle in ganz hervorragender Weise, und jeder, der sich mit der Textsuche auseinandersetzen muss, sollte sich damit vertraut machen. Allein die inkrementelle Suche ist schon so nützlich, dass sie die minimale Einarbeitungszeit mehr als rechtfertigt. (jlu)

Ugrep installieren
Unter Debian und Arch Linux gestaltet sich das Einrichten von Ugrep einfach. Ersteres führt das Tool in seinen Repositories, bei Letzterem weichen Sie auf das AUR aus. Bei allen anderen Distributionen müssen Sie Ugrep aus den Quellen installieren . Die dazu nötigen Kommandos zeigt Listing 2.

Muster
Der Begriff „Muster“ taucht bei Suchprogrammen oft in mehreren Kontexten mit verschiedenen Bedeutungen auf. Muster in Dateinamen legen fest, welche Dateien das Programm bearbeitet. Bei den Mustern für die Dateiinhalte handelt es sich um die eigentlichen Suchmuster, nach denen es die bearbeiteten Dateien durchsucht. Bei Ugrep dürfen diese auch zeilenübergreifend sein. Ugrep und einige andere Suchprogramme kennen außerdem negative Muster. Sie dienen dazu, Dateien auszuschließen oder entsprechende Treffer nicht anzuzeigen. Tatsächlich führt Ugrep dieses Verfahren recht weit: In der Dokumentation des Programms gibt es einen eigenen Abschnitt Search this but not that with ‑v, ‑e, ‑N, --not, ‑f, ‑L, ‑w, ‑x, der sich mit den Feinheiten zu diesem Thema beschäftigt.


© Ilker Celik, 123RF