AA_32782669_123rf_anton_lebedev.jpg

© Anton Lebedev, 123RF

Schneller Suchfilter Icgrep

Gut gefiltert

Zu den häufigsten Aufgaben bei der Arbeit am Rechner zählt das Durchstöbern von Texten nach Suchmustern. Icgrep bietet hier eine moderne, parallel arbeitende und Unicode-fähige Alternative zum klassischen Grep.

Es lässt sich heute nicht mehr ganz eindeutig nachvollziehen, woher der Programmname Grep für das wichtigste textdurchsuchende Werkzeug unter Unix stammt. Es sei ein Akronym für "Global/Regular Expression/Print" oder "Global search for a Regular Expression and Print out", meinen die einen. Der Name habe sich aus dem Kommando g/re/p (global, regular expression, print) des Unix-Standardeditors Ed entwickelt, widersprechen die anderen.

Wie auch immer: Grep durchsucht zeilenweise die Eingaben nach bestimmten, als reguläre Ausdrücke ("regular expressions") formulierten Mustern. Die Fundstellen zeigt das Tool, abhängig von den verwendeten Optionen, als Zeilen mit den Treffern, deren Position, Anzahl oder Ähnliches an.

Dieses Konzept stößt bei heutigen Texten in mehrfacher Hinsicht an seine Grenzen: Zum einen verwenden moderne Systeme schon lange nicht mehr den antiquierten ASCII-Zeichensatz mit seinen 128 Zeichen oder dessen größere, immerhin 256 Zeichen umfassende Brüder wie etwa Latin 1, sondern zunehmend Unicode [1] (siehe Kasten "Unicode-Zeichen nutzen").

Ein weiteres Problem liegt in der Definition der Eingabezeilen. Schon bei den bisherigen, nicht Unicode-fähigen Systemen gab es eine Vielzahl von Varianten, einen Zeilenumbruch zu kennzeichnen beziehungsweise hervorzurufen [2]. Unix-Standard ist NL ("New Line"); bei Unicode kommen weitere hinzu, insbesondere NEL ("New Line"), aber auch LS ("Line Separator") oder PS ("Paragraph Separator").

Erschwerend hinzu kommt die relativ niedrige Arbeitsgeschwindigkeit von Grep bei großen Eingabemengen und komplexen regulären Ausdrücken. Schon im besten Fall erweisen sich Regexe [3] als relativ kompliziert einzugeben. Beim Bearbeiten von komplexen Ausdrücken benötigt der Rechner eine gehörige Menge Rechenleistung. Obendrein gibt es ja auch bedingte, nichtgierige und gierige Regexe sowie viele erweiterte Varianten. Alle Grep-Spielarten verarbeiten reguläre Ausdrücke zur Laufzeit, sodass sich die Komplexität direkt im Rechenzeitbedarf abbildet.

Wie schnell Icgrep [4] im Unterschied zu den Standard-Greps arbeitet, zeigt eine Untersuchung von Fred Popowich [5]. Sie beschreibt ein Szenario, in dem das Standard-Grep für eine Mustersuche über eine Minute benötigt, während Icgrep dieselbe Aufgabe in einer guten Sekunde bewältigt. Nach Aussagen der Icgrep-Entwickler sind Geschwindigkeitsunterschiede mit dem Faktor von bis zu 100 möglich.

Unicode-Zeichen nutzen

Unicode strebt an, jedem existierenden sinntragenden Schriftzeichen oder Textelement aller bekannten Schriftkulturen und Zeichensysteme einen digitalen Code zuzuweisen. Entsprechend umfangreich fällt der Zeichenraum aus – ein einzelnes Zeichen zu codieren, erfordert mehrere Bytes.

Aufgrund des großen Umfangs des Unicode-Zeichenraums gelingt es oft nicht, Zeichen auf der Tastatur direkt einzugeben, weil dafür schlicht die Tasten fehlen. Unter Linux ermöglichen Qt und GTK allerdings die Eingabe über Tastencodes. Dazu stellen Sie den Codes das Tastenkürzel [Strg]+[U] beziehungsweise [Strg]+[Umschalt]+[U] voran – nicht alle Programme unterstützen das.

Insbesondere, wenn Sie die Codes für ein bestimmtes Zeichen nicht kennen, gestaltet es sich oft viel einfacher, diese mit einem kleinen Tool herauszusuchen. Für GTK-basierte Desktops gibt es die zwei oft verwendeten Hilfsprogramme Gucharmap (Abbildung 1) und Gnome-Characters (Abbildung 2). Letzteres eignet sich besonders gut, um Sonderzeichen herauszufinden und deren Codes zu kopieren.

Abbildung 1: Das Werkzeug Gucharmap führt die Zeichen vieler Sprachen systematisch auf. Dazu gibt es jeweils weitere Informationen, um die Gefahr von Verwechslungen zu minimieren.
Abbildung 2: Das Programm Gnome-characters sortiert Sonderzeichen in verschiedene, oft unmittelbar einsichtige Klassen.

Installation

Die Installation von Icgrep erwies sich im Test als nicht ganz trivial und etwas zeitraubend, als Voraussetzungen benötigen Sie Subversion, Cmake und Clang (Listing 1, Zeile 1).

Zuerst laden Sie via Subversion die aktuellste Icgrep-Version auf Ihren Rechner. Die Meldung Ausgecheckt, Revision Nummer. kennzeichnet das Ende dieser Aktion (Zeile 5). Nun wechseln Sie in das Verzeichnis icgrep1.0/icgrep-devel/. In der Datei README-icgrep-1.00a.txt finden Sie unter anderem eine Installationsanleitung. Sie besteht im Wesentlichen aus zwei Teilen: der Übersetzung und der Installation von LLVM ("Low Level Virtual Machine") sowie dem anschließenden Bau von Icgrep selbst.

Zur Installation von LLVM gilt es, die benötigten Makefiles zu erzeugen. Dazu wechseln Sie ins Verzeichnis llvm-build/ (Zeile 6) und lassen dort Cmake seinen Dienst verrichten (Zeile 7). Schon nach kurzer Zeit können Sie den Bau der Low Level Virtual Machine mit make && make install anstoßen (Zeile 10). Der Übersetzungsvorgang dauert je nach Rechenleistung rund eine Stunde, die anschließende Installation nimmt nur wenige Sekunden in Anspruch.

Listing 1

$ sudo apt-get install cmake clang subversion
[...]
$ svn co http://parabix.costar.sfu.ca/svn/tags/icgrep1.0
[...]
Ausgecheckt, Revision 5012.
$ cd icgrep1.0/icgrep-devel/llvm-build/
$ cmake -DCMAKE_INSTALL_PREFIX=../libllvm -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_TOOLS=OFF -DLLVM_BUILD_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/clang++ -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/clang ../llvm-3.5.0.src
[...]
-- Build files have been written to: /home/jluther/icgrep1.0/icgrep-devel/llvm-build
$ make && sudo make install
Scanning dependencies of target LLVMSupport
[  0%] Building CXX object lib/Support/CMakeFiles/LLVMSupport.dir/APFloat.cpp.o
[...]
[100%] Built target LTO
[sudo] password for jluther:
-- Installing: [...]

Im zweiten Schritt erstellen Sie Icgrep (Listing 2). Dazu wechseln Sie ins Verzeichnis icgrep1.0/icgrep-devel/icgrep-build/ und erzeugen darin die Makefiles mit dem Kommando aus der zweiten Zeile. Dabei erkennt der Compiler automatisch, welche CPU-Extensions das Programm zum Beschleunigen der Verarbeitung nutzen kann. Alternativ übergeben Sie über den Schalter -DSIMD_SUPPORT eine der Optionen SSE2, SSE3, SSE4_1, SSE4_2, AVX1 oder AVX2.

Als letzten Schritt erzeugen Sie mit make ohne Optionen die ausführbare Datei (Listing 2, Zeile 15), was wieder etwas länger dauert. Durch strip lässt sich das so erzeugte Programm icgrep noch verkleinern. Zu guter Letzt installieren Sie das Programm manuell im Verzeichnis /usr/local/bin/.

Listing 2

$ cd ../icgrep-build
$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/clang++ -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/clang ../icgrep-1.00a
[... Tests ...]
-- Performing Test AVX2
-- Performing Test AVX2 - Failed
-- Performing Test AVX1
-- Performing Test AVX1 - Failed
-- Performing Test SSE4_2
-- Performing Test SSE4_2 - Failed
-- Performing Test SSE4_1
-- Performing Test SSE4_1 - Success
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jluther/icgrep1.0/icgrep-devel/icgrep-build
$ make
Scanning dependencies of target RegExpADT
[  2%] Building CXX object CMakeFiles/RegExpADT.dir/re/re_re.cpp.o
[... Kompilierung ...]
[100%] Building CXX object CMakeFiles/icgrep.dir/compiler.cpp.o
Linking CXX executable icgrep
[100%] Built target icgrep

In der Praxis

Icgrep steuern Sie wie seine Vettern Grep oder Agrep weitgehend durch Optionen. Da es sich bei dem Tool um eine Forschungssoftware handelt, enthält es zwei beziehungsweise drei Gruppen von Optionen mit unterschiedlicher Relevanz für normale Anwender. Wie üblich zeigt -help die wichtigsten davon. Einen Schritt weiter geht -help-list: Es generiert eine kurze, kompakte Liste wichtiger Schalter, die allerdings schon einiges Wissen über reguläre Ausdrücke voraussetzt. Mit -help-list-hidden erhalten Sie schließlich die vollständige Liste der Optionen, von denen allerdings viele nur in speziellen Fällen von Bedeutung sind.

Muster, also reguläre Ausdrücke, definieren Sie nach dem Schalter -e ("expression"). Falls die Gefahr besteht, dass die Shell darin Meta-Zeichen erkennt und auswertet oder ersetzt, schließen Sie das Muster zwischen einfachen oder doppelten Hochkommas ein. Dem Aufruf, der mehrfach auftreten darf, kann (muss aber nicht) ein Gleichheitszeichen folgen:

$ icgrep -e Mus -e=ter

Diese Art der Ausdrücke stehen dann für ein logisches Oder: Bedingung 1 ODER Bedingung 2 ODER beide müssen erfüllt sein. Wird die Anzahl der Muster zu groß und die Befehlszeilen damit zu unübersichtlich, empfiehlt es sich, die Muster in eine externe Datei auszulagern, jeweils eines pro Zeile. Diese Datei geben Sie durch icgrep -f Musterdatei an. Die wichtigsten Schalter von Icgrep fasst die Tabelle "Wichtige Optionen von Icgrep" zusammen.

Ein deutliches Manko von Icgrep: Es gibt keine Option, Verzeichnisse rekursiv zu bearbeiten, wie dies GNU-Grep mit dem Schalter -r macht. Stattdessen gilt es, auf die Kombination von Find, Xargs und Icgrep zurückzugreifen:

$ find Pfad -type f | xargs icgrep Muster

Alternativ unterstützen heute zwar mehrere Shells, so auch die Bash, die rekursive Verzeichnissuche durch **. Das setzt aber voraus, dass Sie diese Funktion via shopt -s globstar aktivieren. Der Befehl shopt globstar zeigt dann globstar on. Achtung: Dieses Verfahren führt eventuell zu überlangen Argumentlisten und Fehlermeldungen wie -bash: /usr/local/bin/icgrep: Die Argumentliste ist zu lang.

Zu den weiteren wichtigen Optionen, die Icgrep bisher fehlen, zählen -v ("invert match"), -C, -A, -B (Kontextzeilen anzeigen), -m (maximale Trefferanzahl festlegen), -a, -b (Eingaben als Text beziehungsweise binär interpretieren) sowie --color (Treffer in der Ausgabe farbig hervorheben). Einiges davon wollen die Entwickler demnächst implementieren [6].

Wichtige Optionen von Icgrep

Option Funktion
-e=Muster ein Muster definieren, mehrfach angebbar
-f=Datei Musterdatei
-c nur Treffer zählen, nicht zeigen
-n Zeilennummern der Treffer anzeigen
-H Dateinamen anzeigen
-i Groß-/Kleinschreibung ignorieren
-disable-Unicode-linebreak nur noch NL als Zeilenende
-normalize-line-breaks Zeilenenden normalisieren
-dump-generated-IR zeigt die verwendeten regulären Ausdrücke
-print-REs zeigt benannte Ausdrücke

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Zu Befehl: Suchen mit grep, egrep, fgrep, (b)zgrep
    Für die Suche nach Wörtern und Ausdrücken in Textdateien bieten sich die Kommandos der grep-Familie an. Als Ergebnis zeigen sie wahlweise die gefundenen Zeilen, die Namen der Dateien, in denen das Suchmuster vorkommt, oder die Anzahl der Treffer an.
  • Reguläre Ausdrücke
    Regulären Ausdrücken begegnet man auf Unix-Systemen an allen Ecken und Enden. Doch was genau hat es damit auf sich, und wie nutzt man sie?
  • Erste Schritte mit Regular Expressions
    Computer erleichtern die Arbeit – man muss ihnen nur genau sagen, was sie tun sollen. Mit regulären Ausdrücken beschleunigen Sie das Suchen und Ersetzen von Zeichenketten auf elegante Art.
  • Schnipseljagd
    Computer erleichtern die Arbeit – sofern man ihnen genau sagt, was sie tun sollen. Mit regulären Ausdrücken beschleunigen Sie das Suchen und Ersetzen von Zeichenketten auf elegante Art.
  • Zu Befehl
    Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder GNOME regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, wo es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.
Kommentare

Infos zur Publikation

LU 02/2018: PAKETE VERWALTEN

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Wifikarte verhindert Bootvorgang
Maik Kühn, 21.01.2018 22:23, 0 Antworten
iwlwifi-7265D -26 failed to load iwlwifi-7265D -25 failed to load iwlwifi-7265D -24 failed to l...
sharklinux
Gerd-Peter Behrendt, 18.01.2018 23:58, 0 Antworten
Hallo zusammen, ich habe sharklinux von der DVD Installiert. 2x, jedesmal nach dem Reboot ist di...
Anfänger sucht Ratschläge
Alucard Nosferatu, 18.01.2018 21:56, 3 Antworten
Guten Tag, meine Wenigkeit würde gerne auf einer meiner Festplatten von meinen Feldrechnern e...
Suchprogramm
Heiko Taeuber, 17.01.2018 21:12, 1 Antworten
Hallo liebe Community, keine Ahnung ob dieses Thema hier schon einmal gepostet wurde. Ich hab...
Linux Mint als Zweitsystem
Wolfgang Robert Luhn, 13.01.2018 19:28, 4 Antworten
Wer kann mir helfen??? Habe einen neuen Laptop mit vorinstaliertem Windows 10 gekauft. Möchte g...