AA_haystack_supajem_sxc_1136548.jpg

© Supajem, sxc.hu

Nadel im Datenhaufen

Suche in komprimierten Dateien und Archiven

12.03.2012
,
Über die Kommandozeile flink in komprimierten Dateien und Archiven zu suchen, spart viel Zeit. Die richtigen Tools dazu bringt praktisch jedes Linux-System von Haus aus mit.

Um Platz für aktuell nicht mehr benötigte Daten zu schaffen, bietet es sich an, einzelne Dateien zu komprimieren oder diese zu einem komprimierten Archiv zusammenzufassen (siehe Kasten "Komprimierte Datei versus Archiv"). Das Sichern erfolgt danach meist auf einem externen Medium, beispielsweise auf einer DVD, einer weiteren Festplatte oder einem Server im Rechenzentrum.

Komprimierte Datei versus Archiv

Die in diesem Artikel vorgestellten Programme fallen in einigen Fällen in eine der beiden Kategorien Datenkompression und Erzeugen von Archiven, andere kombinieren beides. Zur ersten Kategorie zählen die Tools XZ, Gzip und Bzip2; die zweiten Kategorie besetzt Tar. Zip, 7-zip und Rar verbinden beide Techniken.

Um die mit Gzip, Bzip2 und XZ komprimierten Tar-Archive zu verarbeiten, müssen die Komprimierungsprogramme als Helfer installiert sein. Tar ruft diese direkt auf. Generell erkennen Sie leicht an der Dateiendung, um welche Art von Archiv oder Kompression es sich handelt. Die Tabelle "Dateiendungen" gibt Aufschluss über gängige Formate.

7-zip erweist sich als Spezialfall: Dateien dieses Typs haben üblicherweise die Endung .7z. Die passenden Tools dazu heißen 7z, 7za und 7zr. Der Unterschied liegt darin, welche Formate (zum Teil inklusive Gzip, Bzip2, XZ, LZMA, Rar oder Zip) das Programm beherrscht. Die Namen der Pakete unter Debian und Ubuntu sind p7zip (7zr), p7zip-full (7z, 7za) und p7zip-rar (Rar-Plugin für 7z).

Dateiendungen

Typ Endung
Komprimierte Dateien
Gzip .gz
Bzip2 .bz2
XZ .xz
Archive
Zip .zip
7zip .7z
Rar .rar
Tar .tar
Tar+Gzip .tar.gz
Tar+Bzip2 .tar.bz2
Tar+XZ .tar.xz

Erst zu einem späteren Zeitpunkt taucht meist die spannende Frage auf, wie Sie etwas in diesen komprimierten Dateien und Archiven wiederfinden. Meist kommen einem nur noch Fragmente in den Sinn – ein Teil des Dateinamens, der ungefähre Zeitraum der letzten Bearbeitung oder ein Ausschnitt des Inhalts.

Um die Datei oder das Archiv einfach auszupacken, helfen die Kommandos aus der Tabelle "Archive entpacken". Danach prüfen Sie, ob die gewünschten Inhalte vorliegen. Dieses Vorgehen erweist sich bei kleinen Datenmengen durchaus als praktikabel.

Bei größeren Datenmengen stößt es aber schnell an seine Grenzen, beispielsweise, wenn für die ausgepackten Daten nicht genügend Speicherplatz bereitsteht. Deshalb haben findige Entwickler einfachere und effizientere Wege zum Durchsuchen der Archive ersonnen.

Archive entpacken

Typ Kommando
Komprimierte Dateien
Gzip gunzip Datei.gz, unp Datei.gz
Bzip2 bunzip2 Datei.bz2, unp Datei.bz2
XZ unxz Datei.xz, unp Datei.xz
Archive
Zip unzip Archiv.zip, unp Archiv.zip
7zip 7z e Archiv.7z, unp Archiv.7z
Rar unrar e Archiv.rar, unp Archiv.rar
Tar tar -xf Archiv.tar, unp Archiv.tar
Tar+Gzip tar -xzf Archiv.tar.gz, unp Archiv.tar.gz
Tar+Bzip2 tar -xjf Archiv.tar.bz2, unp Archiv.tar.bz2
Tar+XZ tar -xJf Archiv.tar.xz, unp Archiv.tar.xz

Ohne Auspacken

Im Fall einer komprimierten Datei entspricht der Dateiname in der Regel dem Namen der gepackten Datei. Ein Archiv dagegen fasst unter einem eigenen Dateinamen mehrere Dateien zusammen. Die einzelnen Programme bieten jedoch eine Option, über die Sie die Liste im Archiv ausgeben. Mit den Kommandos aus Tabelle "Inhalt auflisten" durchsuchen Sie das Archiv nur nach Dateinamen und packen es nicht auf den Datenträger aus.

Inhalt auflisten

Typ Kommando
Komprimierte Dateien
Gzip gzip -l Datei.gz
Bzip2 keine Option
XZ xz -l Datei.xz
Archive
Zip unzip -l Archiv.zip
7zip 7z l Archiv.7z
Rar unrar l Archiv.rar
Tar tar -tf Archiv.tar
Tar+Gzip tar -tzf Archiv.tar.gz
Tar+Bzip2 tar -tjf Archiv.tar.bz2
Tar+XZ tar -tJf Archiv.tar.xz

Die Dateiliste des Archivs filtern Sie bei Bedarf mit einem Grep-Kommando, indem Sie den gewünschten Namen als Muster verwenden. Beide Kommandos verbinden Sie dazu über eine Pipe miteinander. Die ausgegebene Dateiliste beinhaltet in jeder Zeile nur einen Dateinamen. Daher gibt das Grep-Kommando nur die Zeilen zurück, auf die das Suchmuster des Dateinamens passt. Drei Varianten von Grep helfen dabei [1]:

  • grep -F (alternativ: fgrep oder grep --fixed-strings): Mit diesem Aufruf extrahieren Sie ausschließlich exakte Vorkommen einer Zeichenkette im Datenstrom. Sonderzeichen ignoriert das Tool.
  • grep -G (alternativ: grep --basic-regexp): Grep ohne Auswahl des Suchmuster-Typs nutzt eine einfachere Variante von regulären Ausdrücken und nimmt das Suchmuster dementsprechend nicht so wortwörtlich wie Fgrep. Es interpretiert verschiedene Sonderzeichen (Wildcards), beispielsweise * als Ausdruck für beliebig viele beliebige Zeichen. Diese einfachen regulären Ausdrücke sind ähnlich (aber nicht identisch) zu den Wildcards, die Sie in der Shell zum Auswählen von Dateien nutzen.
  • egrep (alternativ: grep -E oder grep --extended-regexp): Die "extended regular expressions", also erweiterte reguläre Ausdrücke, entsprechen in etwa den Suchmustern in anderen Kommandozeilenprogrammen, wie zum Beispiel in Sed und Awk, im Editor Vi und im Betrachter Less.

Grep früher und heute

In Debian-Releases bis zur Version 4.0 ("Etch") waren Fgrep und Egrep Verweise auf Grep. Diese reichten den Aufruf an Grep mit der entsprechenden Option und den Parametern weiter, grep -F für fgrep und grep -E für egrep. Das erfolgte über ein Shell-Skript:

$ cat /bin/fgrep
#!/bin/sh
exec grep -F ${1+"$@"}

Mittlerweile hat sich das geändert: Die Kommandos liegen bei den aktuelleren Debian-Versionen als eigenständige Binaries vor. Scientific Linux und Ubuntu handhaben das ähnlich wie Debian, der Red-Hat/Fedora-Ableger CentOS hingegen nicht. Listing 1 zeigt, dass unter CentOS 5.5 Fgrep und Egrep auf Grep linken – zu erkennen am l in den Benutzerrechten und dem Verweis in der rechten Spalte.

Die beiden Kommandos Fgrep und Egrep sind zudem als veraltet gekennzeichnet (siehe dazu die Manpage der Kommandos) und nur aus historischen Gründen noch in dieser Form enthalten. Es steht daher zu erwarten, dass diese Kommandos in der Zukunft entfallen und es stattdessen Grep mit der entsprechenden Option aufzurufen gilt. Ein genauer Termin für diese doch recht gravierende und umstrittene Änderung steht jedoch noch nicht fest.

Listing 1

$ ls -l $(which egrep fgrep grep)
lrwxrwxrwx 1 root root     4 22. Okt 2010  /bin/egrep -> grep*
lrwxrwxrwx 1 root root     4 22. Okt 2010  /bin/fgrep -> grep*
-rwxr-xr-x 1 root root 85060 26. Sep 2009  /bin/grep*

Für ein tar.gz-Archiv liefert die kurze Befehlsfolge aus Listing 2 erste Treffer. Zuerst durchsucht Tar das angegebene Archiv und schickt das komplette Inhaltsverzeichnis auf die Standardausgabe in eine Pipe. Aus dieser erhält Fgrep die Eingabedaten und filtert diese nach dem angegebenen Muster – hier dem Dateinamen.

Listing 2

$ tar -tzf Archiv.tar.gz | fgrep --color Dateiname

Die Option --color wäre für den Aufruf nicht unbedingt notwendig. Sie dient nur der besseren Übersicht in der Ausgabe und sorgt dafür, dass Fgrep den Suchtreffer in der Ausgabe farbig hervorhebt. Für komplexere Suchen mit Sonderzeichen eignen sich Grep und Egrep, zum Beispiel, wenn der genaue Dateiname unklar ist und Sie über ein Muster suchen möchten.

Die Befehlsfolge aus Listing 3 entspricht jener aus Listing 2, nur dass hier ein Bzip2-komprimiertes Archiv zum Einsatz kommt. Mit Hilfe von Egrep und einem regulären Ausdruck als Muster filtern Sie alle Dateinamen aus dem Inhaltsverzeichnis des Archivs heraus, die auf das Muster passen.

Listing 3

$ tar -tjf archiv.tar.bz2 | egrep --color "^rechnung.1[5-7]\.pdf"

Das Sonderzeichen ^ im Suchmuster legt fest, dass die Zeichenkette rechnung nur dann einen Suchtreffer ergeben darf, wenn sie am Zeilenanfang steht. Auf ein beliebiges Zeichen (.) folgen zwei Ziffern, wobei die erste Ziffer mit 1 vorgegeben ist, wohingegen die zweite Ziffer aus dem Bereich von 5 bis 7 stammen darf. Das Musterende bildet ein Punkt, den Sie mit einem Backslash schützen, da Grep ihn sonst als Sonderzeichen interpretiert, und die Zeichenkette pdf. Gültige Treffer für dieses Muster wären zum Beispiel rechnung015.pdf, rechnung817.pdf, rechnung-16.pdf und rechnung-16.pdf.bak.

Kennen Sie von der gesuchten Datei nur das ungefähre Datum der letzten Änderung, wählen Sie einen anderen Weg: Die Tar-Option -v zeigt ausführliche Informationen zu den archivierten Dateien an, also Zugriffsrechte, Eigentümer und Gruppe, Größe, Modifikationsdatum sowie den Dateinamen. Um eine Liste aller Dateien zu erhalten, die einen Zeitstempel vom 11., 12., 13., 21., 22. oder 23. Dezember 2011 besitzen, hilft analog zu obigem Beispiel der Aufruf aus Listing 4.

Listing 4

$ tar -tjvf Archiv.tar.bz2 | egrep --color "2011-12-[12][1-3]"

Egrep fungiert hierbei als Filter der Ausgabe von Tar. Nur die Zeilen, die die Zeichenkette 2011-12-11, 2011-12-12, 2011-12-13, 2011-12-21, 2011-12-22 oder 2011-12-23 enthalten, landen im Ergebnis. Alle Zeichen, die in eckigen Klammern stehen, behandelt das Tool beim Mustervergleich als Alternativen. Hier ergibt sich entweder Ziffer 1 oder 2, gefolgt von der Ziffer 1, 2 oder 3. Mit dieser kompakten Schreibweise des Datums formulieren Sie alle sechs Kombinationen, ohne sie auszuschreiben. Selbst in dieser überschaubaren Situation sparen Sie so bereits Schreibarbeit.

Möchten Sie das Gegenteil erreichen – also alles ausgeben mit Ausnahme dessen, was dem Muster entspricht – verwenden Sie zusätzlich die Option -v (Listing 5). Damit enthält die Ausgabe zwar Dokumente mit dem Muster 2011-11-30 oder 2011-12-24, aber nicht 2011-12-13.

Listing 5

$ tar -tjvf Archiv.tar.bz2 | grep -E -v "2011-12-[12][1-3]"

Komprimierte Dateien

Der erste Aufruf für die Suche in einer komprimierten Datei folgt dem bisher bekannten Muster – Auspacken der Datei auf die Standardausgabe (Tabelle "Archive auspacken"), anschließendes Filtern mittels Grep. Listing 6 zeigt ein Beispiel mit einer Bzip2-komprimierten Datei.

Listing 6

$ bzip2 -dc Datei.bz2 | grep -F "Suchmuster"

Grep gibt alle Zeilen auf die Standardausgabe aus, die auf das Suchmuster passen und mindestens einen Treffer beinhalten. Bei Binärdateien liefert es die Mitteilung Übereinstimmungen in Binärdatei (Standardeingabe).

Interessieren Sie die Zeichenketten, die einen Treffer erzeugt haben, hilft die Option -o. Damit gibt Grep diese zeilenweise aus. Die Anzahl der Treffer ermitteln Sie, indem die Ausgabe über eine Pipe an das Kommando wc -l weiterreichen (Abbildung 1).

Abbildung 1: Über eine Kette von Kommandos ermitteln Sie ganz leicht die Anzahl der Fundstellen für einen String in einer komprimierten Datei.

Die Tabelle "Archive auspacken" enthält eine dritte Spalte mit alternativen Kommandos, die exakt das gleiche wie jene in Spalte 2 bewirken. Viele Werkzeuge bringen Varianten mit, die sich namentlich an das Tool Cat anlehnen. Letzteres gibt den Inhalt einer Datei auf der Standardausgabe aus, wie zum Beispiel xzcat den entpackten Inhalt einer XZ-komprimierten Datei.

Das Programm Ucat gehört zum Unp-Paket [2]. Dies enthält kleine Perl-Skripte, die je nach Format den richtigen Befehl zum Extrahieren ausführen. Gemäß Quellcode unterstützt die Software beispielsweise die Formate Gzip, Tar.Gzip, Bzip2, Tar.bzip2, XZ, Tar.XZ, LZip, Tar.LZip und 7zip. Als Backend nutzt Ucat die entsprechenden Kommandozeilen-Tools, was voraussetzt, dass Sie diese installiert haben.

Archive auspacken

Typ Kommando Alternativkommando
Komprimierte Dateien
Gzip gzip -dc Datei.gz zcat Datei.gz
Bzip2 bzip2 -dc Datei.bz2 bzcat Datei.bz2
XZ xz -dc Datei.xz xzcat Datei.xz
Archive
Zip unzip -p Archiv.zip ucat Archiv.zip
7zip 7z e Archiv.7z -so ucat Archiv.7z
Rar unrar p Archiv.rar ucat Archiv.rar
Tar tar -Of Archiv.tar ucat Archiv.tar
Tar+Gzip tar -xOzf Archiv.tar.gz ucat archiv.tar.gz
Tar+Bzip2 tar -xOjf Archiv.tar.bz2 ucat Archiv.tar.bz2
Tar+XZ tar -xOJf Archiv.tar.xz ucat Archiv.tar.xz

Die Komprimierungsprogramme bringen eigene Werkzeuge zum Suchen mit. Gzip enthält Zgrep, Zfgrep und Zegrep. Bei allen drei Programmen handelt es sich um Shell-Skripte, wobei Zgrep recht umfangreich ausfällt und die eigentliche Arbeit leistet. Zfgrep und Zegrep bestehen aus wenigen Zeilen und rufen lediglich Zgrep mit den Optionen -F beziehungsweise -E auf.

Bei Bzip2 und XZ kommt das selbe Prinzip zum Tragen: Hier heißen die Werkzeuge jeweils Bzgrep, Bzfgrep und Bzegrep beziehungsweise XZgrep, XZfgrep und XZegrep. Obiges Beispiel zur Suche in der Bzip2-Datei ließe sich daher vereinfachen, ähnliches gilt für Aufrufe mit Zgrep und XZgrep.

Wie in Abbildung 2 zu sehen, sucht der Helfer alle Einträge in der Datei, die eine Zeichenkette enthalten, welche mit M beginnt, gefolgt von zwei beliebigen Zeichen und darauf der Zeichenkette er.

Abbildung 2: Bzegrep vereinfacht die Suche in gepackten Archiven.

Für die Suche in Zip-Archiven existiert Zipgrep. Das Shell-Skript gehört zum Unzip-Paket. Bei der Mustersuche greift es auf Unzip und Egrep zurück. Gemäß Manpage reicht Zipgrep alle Optionen und Parameter durch, die Egrep kennt. Im Test stellte sich jedoch heraus, das Zipgrep etwas nachlässig programmiert ist, was dazu führt, dass es Langoptionen ignoriert [3].

Für jeden Treffer gibt das Programm den Dateinamen aus, gefolgt von einem Doppelpunkt und nachfolgend der Zeile mit der passenden Zeichenkette. Wünschen Sie ein farbiges Hervorheben der Treffer, gelingt das derzeit nur über einen kleinen Umweg, da Zipgrep sich an der bekannten Grep-Option --color verschluckt. Deswegen bleibt als Ausweg nur die Kombination von beiden Tools (Abbildung 3). Listing 7 zeigt, wie Sie die beiden Kommandos zu einer Kette verbinden.

Abbildung 3: Ein farbiges Hervorheben der Treffer gelingt im Fall von Zipgrep nur durch nochmaliges Kombinieren mit Grep, da das eigentliche Tool Optionen für Grep verschluckt.

Listing 7

$ zipgrep "[Pp]reis.*pdf" archiv.zip | grep --color -E "[Pp]reis.*pdf"

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

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

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Related content

  • 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.
  • 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.
  • Dichter dran
    Gzip und Bzip2 komprimieren nicht nur Daten, sondern liefern auch kleine, feine Tools zum Betrachten, Durchsuchen und Vergleichen komprimierter Textdateien mit.
  • gzip, bzip2 und tar
    Archivierungsprogramme gibt es wie Sand am Meer; die schnellsten Vertreter ihrer Art nutzen Sie auf der Kommandozeile: Mit kurzen Befehlen packen Sie Ihre Daten zusammen und wieder aus oder archivieren ganze Verzeichnishierarchien.
  • Gut verpackt
    Archivierungsprogramme gibt es wie Sand am Meer; die schnellsten Vertreter ihrer Art nutzen Sie auf der Kommandozeile: Mit kurzen Befehlen packen Sie Ihre Daten zusammen und wieder aus oder archivieren ganze Verzeichnishierarchien.
Kommentare

Infos zur Publikation

title_2014_08

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

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

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

Tipp der Woche

Schnell Multi-Boot-Medien mit MultiCD erstellen
Schnell Multi-Boot-Medien mit MultiCD erstellen
Tim Schürmann, 24.06.2014 12:40, 0 Kommentare

Wer mehrere nützliche Live-Systeme auf eine DVD brennen möchte, kommt mit den Startmedienerstellern der Distributionen nicht besonders weit: Diese ...

Aktuelle Fragen

Server antwortet mit falschem Namen
oin notna, 21.07.2014 19:13, 0 Antworten
Hallo liebe Community, Ich habe mit Apache einen Server aufgesetzt. Soweit, so gut. Im Heimnet...
o2 surfstick software für ubuntu?
daniel soltek, 15.07.2014 18:27, 1 Antworten
hallo zusammen, habe mir einen o2 surfstick huawei bestellt und gerade festgestellt, das der nic...
Öhm - wozu Benutzername, wenn man dann hier mit Klarnamen angezeigt wird?
Thomas Kallay, 03.07.2014 20:30, 1 Antworten
Hallo Team von Linux-Community, kleine Zwischenfrage: warum muß man beim Registrieren einen Us...
openSUSE 13.1 - Login-Problem wg. Fehler im Intel-Grafiktreiber?
Thomas Kallay, 03.07.2014 20:26, 8 Antworten
Hallo Linux-Community, habe hier ein sogenanntes Hybrid-Notebook laufen, mit einer Intel-HD460...
Fernwartung für Linux?
Alfred Böllmann, 20.06.2014 15:30, 7 Antworten
Hi liebe Linux-Freunde, bin beim klassischen Probleme googeln auf www.expertiger.de gestoßen, ei...