Mit grep in großen Dateien suchen, ein paar nützliche Tipps

Heute war ich gezwungen in einer 700MB Datei nach Datensätzen zu suchen, bei denen ein bestimmtes XML Element nicht leer war. 700MB sind zu viel für so ziemliche jedes Textverarbeitungsprogramm auf meinem Mac, zum Glück steckt ja ein ganzes UNIX im Kern des Mac und so kann man mit grep an die Sache rangehen.

Nützliche Doku

Wer gerne Dokumentationen liest – und das sollten wir alle öfter probieren  – der lernt unter auf dieser Apple Developer Seite so ziemlich alles, was man zu grep in OS X wissen sollte. Unter http://www.regular-expressions.info bekommt man dann noch nützliche Details zu den regulären Ausdrücken, die man in grep verwenden kann.

Wir suchen nach nicht leeren CDATA-Elementen

Es gibt bestimmt deutlich bessere Möglichkeiten nicht leere CDATA Elemente in XML zu suchen, aber für meinen Fall habe ich mich an folgende Logik rangemacht:

grep '"LIT_URL"><\!\[CDATA\[.\{1,\}\]\]' /Users/cwolf/Desktop/TEST/LitDB_UTF8.xml

Für mich am schwierigsten war es zu lernen, dass .{1,} in grep als .\{1,\} eingegeben werden muss. Mit + hatte ich einfach kein Glück. Das Ergebnis war aber zu mindestens richtig und lies mich weiterarbeiten.

Grep gibt jedoch nur die gefundene Zeile aus. So ein XML Datensatz hat aber deutlich mehr.

Zeilen vor und nach dem Fundstelle ausgeben

Mit -A n, -B n & -C n kann man nun in grep vorgeben, wie viele Zeilen (n = eine Zahl) vor der Fundstelle (-A n), nach der Fundstelle (-B n) oder vor und nach der Fundstelle (-C n) ausgegeben werden sollen.

Die Anzahl der Fundstellen reduzieren

Grep braucht Zeit und ich brauchte nur ein paar Beispiele – drei waren ok. Auch hier gibt es in grep einen nützlichen Modifier. -m n (z.B. -m 3)  limitiert die Anzahl der Fundstellen, auf die angegebene Zahl.

Daten ausgeben

Terminal-Befehle werden im Termin ausgegeben, aber meistens will man das Ergebnis teilen. Als dran denken, das Ergebnis in eine Textdatei ausgeben zu lassen. Im Terminal erledigt man das in dem man ans Ende eines Befehls > ~/PFAD/dateiname eingibt.

Das Gesamtwerk

grep -m3 -C100 ‚“LIT_URL“><\!\[CDATA\[.\{1,\}\]\]‘ /Users/cwolf/Desktop/TEST/LitDB_UTF8.xml >~/Desktop/TEST/sampleoutput.txt

Warum auf diesem Blog?

Berechtigte Frage. Ist mein Blog und ich schau hier bestimmt das nächste mal nach, wenn ich mich mit grep rumschlagen muss ;)

Claus Wolf

Seit 1994 im Netz unterwegs und seit 2004 eingefleischter Mac-Nutzer. 21.5" iMac - 2.9GHz Intel Core i5, 16GB RAM, 1TB Fusion Drive HDD / 128GB iPhone 7 / 128GB iPad 9,7" (2017) / 15" MacBook Pro (Mitte 2014) in der Firma...

Das könnte Dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.