it-swarm.com.de

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

Ich muss etwas in einer riesigen Protokolldatei (über 14 GB) suchen. Ich bin mir ziemlich sicher, dass es in den letzten 4 GB oder so ist.

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

34
Roger

Ich denke, Sie könnten tail verwenden, um nur die letzten 4 GB oder so mit dem Schalter -c Auszugeben

-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 etwas mit dd tun, indem Sie bs=1 Und skiping auf den Offset setzen, den Sie starten möchten, z.

dd if=file bs=1024k skip=12g | grep something
75
user9517

Ich poste dies nur, weil einige der Kommentare danach gefragt haben.

Am Ende habe ich (15 GB Datei) verwendet. 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 Datei
// dauerte ewig (> 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 tail ist nur ein bisschen kürzer.

NB : das verwendete Suffix g und G unterscheiden sich pro Befehl (Ubuntu 15.10)

32
Roger

Dies beantwortet nicht die Titelfrage, aber es wird tun, was Sie tun möchten. Verwenden Sie tac, um die Datei umzukehren, und verwenden Sie grep, um Ihre Zeichenfolge zu finden. Wenn Ihre Zeichenfolge nur einmal oder eine bekannte Anzahl von Malen in der Datei vorkommt, lassen Sie sie laufen, bis die bekannte Anzahl von Vorkommen gefunden wird. Auf diese Weise wird Ihre Annahme, wo sie sich in der Datei befindet, immer noch gefunden. Wenn Sie es einschränken möchten, können Sie dazu head verwenden. Der Befehl head würde zwischen tac und grep wechseln.

Der Befehl sieht also so aus:

tac < logfile | grep myString
19
Itsme2003