Schneiden Sie die Hälfte einer sehr großen Datei ab

414
tannerli

Wir haben ein Ablaufverfolgungsprotokoll auf unserem Produktivsystem unaufhaltsam laufen lassen. Es ist auf fast 50 GB angestiegen und hat dazu geführt, dass die Festplatte fast voll ist. Ich habe die Ablaufverfolgung angehalten, damit die Datei nicht weiter wächst. Ich brauche nicht die ganze Datei, aber ich möchte auch nicht das Ganze löschen und die letzten GB oder so beibehalten.

Worüber ich nachgedacht und entlassen habe:

  • Wenn Sie die Datei abschneiden, verlieren Sie die letzten Daten, die ich erhalten möchte
  • PowerShell gc | select -last 1000scannt vorwärts und benötigt sogar für eine 5 GB-Datei ewig Zeit (Interessanterweise benötigte der Befehl mehr als 8 GB RAM für die 5 GB-Datei, bevor ich sie abschaltete.)
  • Es ist nicht möglich, die Datei für die Aufbewahrung zu verschieben (dies ist eine Kundenseite).

Gibt es einen anderen einmaligen Shell-Magie-Befehl, um die Datei möglicherweise zu halbieren und durch wiederholte Halbierungen die gewünschte Größe zu erreichen?

Oder vielleicht eine Möglichkeit, die Datei in Stücke aufzuteilen? (Dies muss vor Ort erfolgen, da keine vollständige Kopie der Datei vorhanden ist.)

1
In Linux gibt es "fallocate --punch-hole", das Daten löscht und die Datei sparsam macht. Sie können es jedoch nicht mit NTFS verwenden. Ich hoffe, es gibt etwas Ähnliches für Windows und seine Dateisysteme. Kamil Maciorowski vor 5 Jahren 0
@KamilMaciorowski ist der Tipp für 'Fallocate'. Das wird mir immer noch nützlich sein, da ich normalerweise unter Linux bin :-) tannerli vor 5 Jahren 0
Jetzt sehe ich, dass 'fallocate - collapse-range' in ähnlichen Situationen noch nützlicher ist. Viel Glück mit Windows. Kamil Maciorowski vor 5 Jahren 0
Es ist erstaunlich, wie viele tolle Tools es auch nach fast 10 Jahren Linux-Erfahrung für mich noch zu entdecken gibt. An diesem Punkt sieht es so aus, als würde ich die Datei unter Windows einfach abschneiden und sie täglich aufrufen. tannerli vor 5 Jahren 0
Auch unter Linux können Sie so etwas wie `tail -100000 [Dateiname]> [neuer Dateiname] tun; rm [Dateiname] `, um die letzten 100.000 Zeilen für die Analyse zu erhalten. Mike Scott vor 5 Jahren 0
@ MikeScott davon dachte ich mir. Afaik, Powershell hat keinen rückwärts scannenden Befehl. tannerli vor 5 Jahren 0

1 Antwort auf die Frage

1
harrymc

Es gibt viele Möglichkeiten, eine große Datei zu teilen und zusammenzufügen.

Wenn Sie ein kostenloses Dienstprogramm eines Drittanbieters akzeptieren, können Sie HJ Split oder GSplit verwenden . Es gibt jedoch viele andere.

Wenn Sie die Datei als Ganzes beibehalten und gleichzeitig in Blöcke komprimieren möchten, können Sie 7Zip verwenden. Im Bildschirm Add to Archive haben Sie das Feld Auf Datenträger aufteilen. Geben Sie dabei die Anzahl der Bytes für jeden und einige der Blöcke an Mehr Optionen.

Wenn Sie ein PowerShell-Skript bevorzugen, können Sie Split-File.ps1 verwenden, das die Funktionen für die Aufteilung nach Byte und den Join enthält:

Split-File "BigFile.dat" 10000000 dir BigFile??.dat | Join-File Rebuild.dat 

Wenn Sie das Windows-Subsystem für Linux (WSL) verwenden, können Sie die Linux-Befehle von split und cat verwenden .

Wenn Sie nur einen Teil der Datei kopieren möchten, können Sie diesen PowerShell-Einzeiler verwenden, der die Befehle Get-Content und Set-Content verwendet :

$file = (Get-Content log.txt)[<from-line..<to-line>] | Set-Content logpart.txt 

Get-Contenthat auch den -TailParameter, nach dem Sie gefragt haben, hoffentlich effizienter.

Die genannten Tools sind keine Option. Ich kann (oder sollte zumindest nicht) neue Software auf dem Server installieren. Der Link zu 'Split-File.ps' verweist leider auf eine andere SU-Frage, die Sie kommentiert haben ... tannerli vor 5 Jahren 0
Oups - Ich habe die Verbindung behoben. harrymc vor 5 Jahren 0
Vielen Dank für den (aktualisierten) Link zum PowerShell-Skript. Wie in meiner Frage erwähnt, kann ich keine (aufgeteilte) Kopie der Datei erstellen, da die Festplatte bereits knapp wird. Das Skript sollte jeden Teil der verarbeiteten Daten entfernen, während es weiterläuft, was die Frage erneut auffordert, wie der erste GB (oder so) einer Datei entfernt wird. tannerli vor 5 Jahren 0
Können Sie keine externe Festplatte verwenden? harrymc vor 5 Jahren 0
Nein, ich kann nicht. Es ist eine Kundenmaschine, die sich aus meiner Sicht irgendwo im Internet befindet tannerli vor 5 Jahren 0
Ich habe einen weiteren PowerShell-Befehl hinzugefügt, der helfen könnte. harrymc vor 5 Jahren 0
Die Option "-Tail" für "Get-Content" scheint die Scan-Reihenfolge umzukehren. Damit konnte ich die letzten 100.000 Zeilen in eine separate Datei extrahieren. Jetzt kann ich den Rest sicher entfernen. Vielen Dank tannerli vor 5 Jahren 0
Die Frage bezieht sich auf 50-GB-Dateien und alle genannten PowerShell-Lösungen puffern die gesamten Daten in den Arbeitsspeicher. Das wird sehr ineffizient sein. Es muss eine Lösung geben, die Dateisystem-APIs verwendet ... George Chakhidze vor 5 Jahren 0
@ GeorgeChakhidze: Pufferung von Platte zu Platte ist nicht möglich - Daten müssen vom RAM übertragen werden. harrymc vor 5 Jahren 0