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 ;)
0 Kommentare