PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bearbeiten von sehr grossen Dateien ?



Kultakala
26.01.07, 08:37
Hallo allerseits,

weiss nicht ob ich im richtigen Unterforum bin...
Falls nicht, bitte verschieben.

Also, ich habe mal folgende Frage an die Wissenden...
Auf einem relativ gut ausgestatteten System (3 GHz, 4 GB RAM) habe ich recht grosse logfiles liegen.
Die Dateien sind jeweils zwischen 1 und 8 GByte gross.
Um einzelne Zeilen mit bestimmtem Inhalt rauszufiltern kann ich "zgrep" nehmen...
Aber nun habe ich das Problem dass ich dem Zeitstempel nach Teile der logfiles wegschneiden möchte.
Z.B. sind in dem logfile die log-Meldungen von 0 bis 24 Uhr und ich möchte 0 bis 8 Uhr und 16 bis 24 Uhr wegschneiden
damit nur 8 bis 16 Uhr übrig bleibt.

Meine Lösung bisher... die Datei im vi öffnen, die Zeilennummer von 8 Uhr bzw. 16 Uhr suchen und
jeweils alles davor oder dahinter löschen.
Das öffnen und suchen geht erstaunlicherweise noch halbwegs schnell (einige Minuten).
Aber das löschen dauert ewig.

Gibts ne Möglichkeit Teile der Datei abzuschneiden ohne sie im Editor öffnen zu müssen ?
Oder eine ganz andere Variante ?

Freue mich über jeden Hinweis!

Gruß,

kultakala

sepp2k
26.01.07, 09:01
Warum machst du das nicht auch einfach mit zgrep? Ich weiß ja nicht genau, in welcher Form die Zeit in der Datei angegeben ist, aber sowas in der Art sollte doch gehen:
zgrep -E '^(0[89]|1[0-6])' logfile.gz

Das sollte funktionieren, wenn die ersten beiden Zeichen jeder Zeile die Stunde angeben. Wenn Zeiten vor 10 Uhr als X:YY und nicht als 0X:YY angegeben werden, musst du halt die 0 wegmachen und wenn die Zeit in eckigen Klammern steht oder so, halt die (escapeten) Klammern ergänzen.

marce
26.01.07, 09:04
ansonsten - evtl. über sed an der Konsole - da könnte die RegEx halt evtl. ein bisserl komplexer werden oder ein kleines Perlscript schreiben, welches Zeile für Zeile durchgeht und eine Ergebnisdatei generiert... - machen wir hier öfters mit ca. in der Summe 60GB Logfiles...

sepp2k
26.01.07, 09:13
ansonsten - evtl. über sed an der Konsole - da könnte die RegEx halt evtl. ein bisserl komplexer werden
Es gibt RegEx, die für grep zu komplex sind? Ich dachte, der einzige Unterschied ist, dass du bei grep nur matchen kannst (und halt die gematchten Zeilen unverändert angezeigt bekommst) und bei sed suchen&ersetzen. Und dass man bei grep halt nicht über mehrere Zeilen matchen kann.

Außerdem: Müsstest du für sed nicht erst entzippen oder durch zcat pipen oder so? Oder gibt's auch sowas wie zsed?

Kultakala
26.01.07, 09:14
Mit Perl oder so kenne ich mich nicht aus... dafür reichts jedenfalls nicht...

In Datei stehen die Unix-Timestamps am Anfang die ich dann im nächsten Arbeitsgang umwandel in normale Zeitstempel.

Aber das gleich im zgrep mitzumachen ist vielleicht ne Möglichkeit.
Werde ich mal ausprobieren...

Danke schonmal !

Aber vielleicht gibts ne Möglichkeit die ersten z.B. 500000 Zeilen zu löschen ohne die Datei wirklich zu öffnen ?

sepp2k
26.01.07, 09:25
Aber vielleicht gibts ne Möglichkeit die ersten z.B. 500000 Zeilen zu löschen ohne die Datei wirklich zu öffnen ?
Also geöffnet werden muss die Datei auf jeden Fall um was zu löschen. Aber wenn du das z.B. mit ex machst, muss die Datei dafür vielleicht nicht komplett eingelesen werden.

:1
:500000delete
:wq

marce
26.01.07, 09:46
Es gibt RegEx, die für grep zu komplex sind?
... habe ich nicht behauptet. Ich meinte nur das die RegEx an sich komplex werden könnte - wenn man das alles gleich mit abwurschteln will, dass man hinterher nur noch gewünschte Zeilen drin hat...

Frage: 1-8GB: gezippt oder entpackt?

Ansonsten - es würde sich vermutlich lohnen, sich dafür in Perl einzuarbeiten.

sepp2k
26.01.07, 09:57
... habe ich nicht behauptet. Ich meinte nur das die RegEx an sich komplex werden könnte
Klar, können sie das, aber ich verstehe nicht, wofür man sed statt grep nehmen soll. Und ich hatte, dass so verstanden, dass du meintest, man solle sed nehmen, WEIL die RegExp so kompliziert werden können.

marce
26.01.07, 10:00
Zitat "Wag the dog": "Das war ein Missverständnis"

Kultakala
26.01.07, 10:15
@marce: Die Größe ist ausgepackt...

Ich werd bei Gelegenheit mal n bissl Eure Hinweise austesten.

Danke jedenfalls!

P.S. Eh ich mich in Perl eingearbeitet habe, brauch ich das wahrscheinlich nicht mehr :)

marce
26.01.07, 11:38
Aber vielleicht gibts ne Möglichkeit die ersten z.B. 500000 Zeilen zu löschen ohne die Datei wirklich zu öffnen ?

... wenn Du kein Problem damit hast, einen neue Datei anzulegen:

more +500000 $datei > $dateineu

sepp2k
26.01.07, 11:46
... wenn Du kein Problem damit hast, einen neue Datei anzulegen:
Bei ner 8GB-Datei kann das aber ne Weile dauern. Außerdem ist das Platzverschwendung.