Grep in einer riesigen Logdatei (> 14 GB) nur die letzten x GB?

34

Ich muss etwas in einer riesigen Protokolldatei suchen (über 14 GB). Ich bin mir ziemlich sicher, dass es sich um die letzten 4 GB handelt.

Gibt es eine Möglichkeit, die ersten X GB zu überspringen, um die Dinge zu beschleunigen?

Roger
quelle
7
LC_ALL=C grepkann es beschleunigen.
jfs
1
Sie werden in der Lage sein, viel Geschwindigkeit zu erreichen, indem Sie einen vernünftigen grepAusdruck auswählen ... Wildcards mit unbekannter Länge (wie a.*thing) werden in einigen Fällen viel länger brauchen, um ausgewertet zu werden. Möglicherweise optimieren Sie für das Falsche (obwohl es natürlich nie schadet, nur einen Teil der Datei zu durchsuchen - dies ist möglicherweise nicht die beste Quelle für die Beschleunigung).
Floris

Antworten:

75

Ich denke, Sie könnten tail verwenden, um nur die letzten 4 GB auszugeben, indem Sie den -cSchalter verwenden

-c, --bytes = [+] NUM gibt
die letzten NUM Bytes aus; Oder verwenden Sie -c + NUM, um beginnend mit Byte NUM jeder Datei auszugeben

Sie könnten wahrscheinlich auch mit dd etwas anfangen, indem Sie den Offset einstellen bs=1und einstellen skip, den Sie starten möchten, z

dd if=file bs=1024k skip=12g | grep something
user9517 unterstützt GoFundMonica
quelle
83
Danach sollten Sie logrotate konfigurieren.
Gerald Schneider
3
@Rogier Bitte fügen Sie eine Antwort mit der Lösung hinzu, anstatt sie Ihrer Frage hinzuzufügen. Dies ähnelt der Selbstantwort: serverfault.com/help/self-answer
AL
5
@istheEnglishway: Nun, nein, sie haben einen anderen Befehl gepostet.
Leichtigkeit Rennen mit Monica
11
Ihre Antwort liefert jedoch nicht den tatsächlichen Befehl, der diese Lösung implementiert, was einen Mehrwert darstellt. Sie können dies in Ihrer Antwort bearbeiten oder das OP könnte es als neue Antwort veröffentlichen. Sie sollten es definitiv nicht zu der Frage hinzufügen, was passiert ist. Und du solltest auf keinen Fall Epitheta wie "steck deine Nase rein" herumwerfen.
Leichtigkeit Rennen mit Monica
7
@istheEnglishway, ob Sie es glauben oder kein Beispiel haben, macht es einfacher, als eine Manpage zu lesen (siehe auch: Stackoverflow-Dokumentation)
Pierre.Sassoulas
32

Ich poste dies nur, weil einige der Kommentare danach fragten.

Was ich am Ende mit war (15 GB-Datei). Es hat sehr schnell funktioniert und mir eine Menge Zeit gespart.

tail -f -c 14G file | grep something

Ich habe auch einen sehr rudimentären Benchmark für dieselbe Datei durchgeführt. Ich habe getestet:

grep xxx file
// hat ewig gedauert (> 5 Minuten)

dd if = Datei bs = 1 skip = 14G | grep xxx
// sehr schnell <1 sek

Schwanz -c 14g | grep xxx
// ziemlich schnell <2 sek

das tailist nur ein bisschen kürzer.

NB: das verwendete Suffix gund der GUnterschied pro Befehl (Ubuntu 15.10)

Roger
quelle
Haben Sie den Festplatten-Cache zwischen den Benchmarks geleert? Ich vermute, dass die meiste Zeit in der ersten Zeit I / O war. Die Beschleunigung sollte in der Größenordnung von 15 × und nicht 300 × liegen.
Reid
2
@Reid habe ich nicht. Aber ich habe jeden Befehl mehrmals ausgeführt. Ich bin mir ziemlich sicher, dass dd oder tail die Geschwindigkeit deutlich steigern werden , wenn nur grep (Cache oder nicht).
Roger
19

Dies beantwortet die Titelfrage nicht, aber es wird tun, was Sie tun möchten. Verwenden Sie tac, um die Datei umzukehren, und dann grep, um Ihre Zeichenfolge zu finden. Wenn Ihre Zeichenfolge nur einmal oder in bekannter Anzahl in der Datei vorkommt, lassen Sie sie so lange laufen, bis sie die bekannte Anzahl von Vorkommen findet. Auf diese Weise wird Ihre Annahme, wo sie sich in der Datei befindet, immer noch falsch sein. Wenn Sie es begrenzen möchten, können Sie head verwenden, um dies zu tun. Der Kopfbefehl würde zwischen dem tac und dem grep gehen.

Der Befehl sieht also so aus:

tac < logfile | grep myString
Itsme2003
quelle
1
Ich bin hergekommen, um genau die gleiche Antwort zu schreiben. Ich bin überrascht, dass niemand deins empört hat.
Dmitry Grigoryev
2
Dauerte eine Minute, aber dann stöhnte ich beim Pun ... tac ist das Gegenteil von Katze.
Sammi
1
Ich musste mich in einem Anwendungs- / Debug-Protokoll umsehen . Da es die Zeilen umkehrt, wird es nicht einfacher zu lesen ;-) Scheint jedoch sehr schnell zu sein. Noch nie gesehen tac, also danke!
Roger