Erhalte die letzten n Zeilen oder Bytes einer riesigen Datei in Windows (wie Unix's Tail). Vermeiden Sie zeitraubende Optionen

9

Ich muss die letzten n Zeilen von riesigen Dateien (1-4 Gb) in Windows 7 abrufen. Aufgrund von Unternehmensbeschränkungen kann ich keinen Befehl ausführen, der nicht integriert ist. Das Problem ist, dass alle gefundenen Lösungen die ganze Datei zu lesen scheinen, also sind sie extrem langsam.

Kann dies schnell erreicht werden?

Anmerkungen:

  1. Ich habe es geschafft, die ersten n Zeilen schnell zu bekommen.
  2. Es ist in Ordnung, wenn ich die letzten n Bytes bekomme. (Ich habe diese Ссылка für die ersten n Bytes verwendet.)

Lösungen hier Unix-Tail-Äquivalent-Befehl in Windows Powershell nicht Arbeit. Die Verwendung von -wait macht es nicht schnell. Ich habe -tail nicht (und ich weiß nicht, ob es schnell geht).

PS: Es gibt einige verwandte Fragen für head und tail , aber nicht das Thema Geschwindigkeit. Daher sind nützliche oder akzeptierte Antworten hier möglicherweise nicht nützlich. Z. B.

Windows entspricht dem Befehl "tail"

CMD.EXE Batch-Skript zum Anzeigen der letzten 10 Zeilen aus einer TXT-Datei

Extrahiere N Zeilen aus der Datei mit dem Befehl single windows

Ссылка

Powershell, um das erste x MB von a zu erhalten Datei

Ссылка

    
sancho.s 08.04.2016, 19:02
quelle

5 Antworten

9

Wie wäre es damit (liest die letzten 8 Bytes für eine Demo):

%Vor%

UPDATE Um Bytes als String zu interpretieren (aber achten Sie darauf, die richtige Kodierung zu wählen - hier wird UTF8 verwendet):

%Vor%

UPDATE 2 . Um die letzten M Zeilen zu lesen, lesen wir die Datei nach Abschnitten, bis mehr als M Zeilenumbruchzeichenfolgen im Ergebnis sind:

%Vor%

Versuchen Sie, mit größerer $buffer_size zu spielen - dies entspricht idealerweise der erwarteten durchschnittlichen Zeilenlänge, um weniger Festplattenoperationen durchzuführen. Achten Sie auch auf $ seq - dies könnte \r\n oder nur \n sein. Dies ist sehr schmutziger Code ohne Fehlerbehandlung und Optimierungen.

    
Aziz Kabyshev 08.04.2016, 22:24
quelle
20

Wenn Sie PowerShell 3 oder höher haben, können Sie den Parameter -Tail für Get-Content verwenden, um die letzten n -Zeilen zu erhalten.

%Vor%

Bei einer 34-MB-Textdatei auf meiner lokalen SSD kam dies in 1 Millisekunde vs. 8,5 Sekunden für get-content |select -last 5

zurück     
alroc 08.04.2016 19:13
quelle
1

Dies ist keine Antwort, sondern ein großer Kommentar als Antwort auf die Antwort von sancho.s.

Wenn Sie kleine PowerShell-Skripts aus einer Batch-Datei verwenden möchten, empfehle ich Ihnen, die folgende Methode zu verwenden, die einfacher ist und den gesamten Code in derselben Batch-Datei speichern kann:

%Vor%     
Aacini 09.04.2016 14:46
quelle
1

Mit der großartigen Antwort von Aziz Kabyshev , die das Problem der Geschwindigkeit löst, und mit etwas Googeln, endete ich mit diesem Skript

%Vor%

Ich rufe von einer Batchdatei auf, die

enthält %Vor%

(Danke an So führen Sie ein PowerShell-Skript aus aus einer Batch-Datei ).

    
sancho.s 09.04.2016 11:56
quelle
-2

versuche es mit

%Vor%     
Nuthan Kumar 08.04.2016 19:07
quelle