Wie können Sie mit großen Protokolldateien schneller nach weniger suchen?

15

Ich habe es oft mit unglaublich großen Protokolldateien (> 3 GB) zu tun. Ich habe festgestellt, dass die Leistung von weniger mit diesen Dateien schrecklich ist. Oft möchte ich in der Mitte der Datei springen, aber wenn ich weniger sage, um 15 M Zeilen vorwärts zu springen, dauert es Minuten.

Ich stelle mir das Problem vor, dass weniger die Datei nach '\ n' Zeichen durchsuchen muss, aber das dauert zu lange.

Gibt es eine Möglichkeit, es nur zu einem expliziten Offset zu bringen? ZB versuchen, in der Datei 1,5 Milliarden Byte Offset. Diese Operation sollte um Größenordnungen schneller sein. Wenn weniger eine solche Fähigkeit nicht bietet, gibt es ein anderes Werkzeug, das dies tut?

UsAaR33
quelle
Wenn Sie die Datei nach verbotenen Zeichen durchsuchen, können Sie davon ausgehen, dass Sie die oben genannten Zeichen löschen, nachdem Sie sie gefunden haben. Wenn ja, darf ich anbietenperl -pi -e 's/\n//g;' <filename>
Mike Pennington
Entschuldigung, überfliegen war das falsche Wort. Sollte Scan verwendet haben. less by design sucht nach newline (\ n). Dieser Scanvorgang dauert bei großen Dateien sehr lange.
UsAaR33

Antworten:

20

Sie können weniger davon abhalten, Linien wie diese zu zählen less -n

Um zu einem bestimmten Ort zu springen, wie z. B. 50% in. less -n +50p /some/logDies war für mich sofort in einer 1,5-GB-Protokolldatei.

Bearbeiten: Für einen bestimmten Byte-Versatz: less -n +500000000P ./blah.log

Sekenre
quelle
1
Zeilenzählung war nie das Problem; Ich könnte dafür einfach escp / ctrl-c verwenden. Dies ist jedoch die eigentliche Antwort. P springt auf einen bestimmten Byte-Offset!
UsAaR33
5

Less ist als Pager von Natur aus zeilenorientiert. Wenn Sie eine große Datei starten, wird "Zeilennummern zählen" angezeigt, und Sie drücken die ESC-Taste, um dies zu stoppen. Andernfalls werden Zeilen gezählt. Es ist was es tut.

Wenn Sie direkt in die Mitte der Datei springen und den Anfang überspringen möchten, können Sie immer nur über den Anfang hinaus suchen. Ich würde sowas machen tail -c +15000000 /some/log | less.

womble
quelle
3
Sie meinen, tail -c ...oder Sie haben einen seltsamen lastBefehl.
Alan Curry
Das Problem bei dieser Strategie ist, dass Sie nicht mehr innerhalb weniger Minuten in der gesamten Datei suchen können (Suche nach bestimmten Nachrichten usw.).
Sekenre
@ AlanCurry: Es ist nur eine alternative Schreibweise ... <
grins
0

less scheint einen kleinen Overhead von den Gebietsschemaeinstellungen zu haben

Wenn Sie nur ASCII-Zeichen verwenden, können Sie dies etwas beschleunigen, indem Sie Folgendes verwenden:

LC_ALL=C less big-log-file.log

In meinem Fall stieg der Durchsatz von ~ 30 MBit / s auf ~ 50 MBit / s (Rate ist CPU-gebunden)

Romuald Brunet
quelle