Ich möchte ein Datum ausfindig machen, das sich irgendwo in einem 8-GB-Protokoll befindet (Text).
Kann ich einen vollständigen sequentiellen Lesevorgang etwas umgehen und zuerst binäre Teilungen der Datei (Größe) oder irgendwie im Dateisystem navigieren inodes
(über das ich nur sehr wenig weiß ), um an jedem Teilungspunkt mit dem Lesen zu beginnen, bis ich einen geeigneten Versatz von gefunden habe? Wo soll ich mit der Textsuche nach einer Zeile beginnen, die das Datum enthält?
tail
Beim Lesen der letzten Zeile wird kein normales sequentielles Lesen verwendet. Daher frage ich mich, ob diese Funktion in Bash verfügbar ist oder ob ich Python oder C / C ++ verwenden muss. Ich bin jedoch speziell an einer bash
Option interessiert ..
bash
filesystems
text-processing
Peter.O
quelle
quelle
Antworten:
Das Programm .. erstellt keine temporären Split-Dateien, überspringt Blöcke mit 512 MB Daten bei jedem Durchlauf, liest 64 Byte von dieser Position und begrenzt die Ausgabe auf die erste Zeile dieser 64 Byte.
Vielleicht möchten Sie 64 auf das einstellen, was Sie für nötig halten.
quelle
dd
Es ist ein großartiges Werkzeug! :)Es klingt wie Sie wollen:
oder wie viele Bytes Sie überspringen möchten. Das Pluszeichen weist den Tail an, vom Anfang der Datei anstatt vom Ende zu messen. Wenn Sie die GNU-Version von tail verwenden, können Sie dies wie folgt schreiben:
Um eine feste Anzahl von Bytes nach dem Ausschneiden zu erhalten, leiten Sie diese anstelle des gesamten Restes der Datei einfach durch den Kopf:
quelle
dd
springt zu einem bestimmten Byte (wie auchtail
), aber es ist ein Schmerz, der unbekannte Zeilenlängen umkodiert, und dann ein Aufruf an sed, um führende Teilzeilen abzulösen ... Es sieht so aus, als ob tail | head dies schmerzlos tun kann (so schnell?) . Ich verstehe nicht, wie der Kopf den Hahn am Schwanz abstellen kann, aber es scheint :) Es muss der Fall sein: Wenn der Kopf aufhört zu empfangen, hört der Schwanz auf zu senden (und hört auf weiter zu lesen). Muss gehen .. morgen zurück.tail
/head
sind nicht in der Lage , die Leitungslängen als auch blind erraten. Sie müssen zu Position x springen und dann können Sie entweder links oder rechts von x nach dem nächsten suchen\n
. es ist egal, wie das Programm heißt. In beiden Fällen springen Sie also zu x undhead
suchen dann mit nach rechts das nächste Zeilenende.tail|head
bietet die Möglichkeit, sich überhaupt nicht umdd
's count = val zu kümmern . Wenn ich mit 'dd' nicht genügend Daten erhalte, ist das Spiel zu Ende. Die Flexibilität beliebiger Leitungslängen ist groß. Ich habe eine Funktion für 'dd' geschrieben, die die "nächstgelegene" vollständige Zeile und ihren Versatz zurückgibt, aber ich würde es vorziehen, das Längenproblem zu vermeiden. Ich habe jetzt tail | head getestet und es funktioniert anfangs gut (auf Offset = 100 MB), verlangsamt sich aber dramatisch, um 2 Minuten für einen Zugriff auf Offset = 8 GB zu benötigen (ich kannawk
es in 1 Minute) ... also ist es großartig für kleinere Dateien .. Danke, dass du mich auf die Schwanz / Kopf-Kombination aufmerksam gemacht hast :)Ich würde so etwas versuchen, um das Protokoll zur schnelleren Analyse in 512-MB-Blöcke aufzuteilen.
Wenn Sie nach der Datei suchen, funktioniert Folgendes:
Verwenden Sie diese Ausgabe, um zu bestimmen, welche Datei für Ihr Datum verwendet werden soll.
quelle
Hier ist mein Skript, ich suche die erste Zeile, in der das erste Feld meiner Nummer entspricht. Die Zeilen sind nach dem ersten Feld sortiert. Ich benutze dd, um die erste Zeile von 128K-Blöcken zu überprüfen, dann springe ich zum Block und führe eine Suche durch. Es verbessert die Effizienz, wenn die Datei mehr als 1 MB groß ist.
Jeder Kommentar oder jede Korrektur ist willkommen!
* EDIT * ** grep ist viel schneller und ack noch besser
quelle