Lösung 1:
Ich denke, Sie könnten tail verwenden, um nur die letzten 4 GB oder so auszugeben, indem Sie den -c
verwenden Schalter
-c, --bytes=[+]NUM
gib die letzten NUM Bytes aus; oder verwenden Sie -c +NUM zur Ausgabe beginnend mit Byte NUM jeder Datei
Sie könnten wahrscheinlich auch etwas mit dd machen, indem Sie bs=1
setzen und skip
ing zu dem Offset, mit dem Sie beginnen möchten, z. B.
dd if=file bs=1024k skip=12g | grep something
Lösung 2:
Ich poste dies nur, weil einige der Kommentare danach gefragt haben.
Was ich am Ende verwende, 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. Getestet habe ich:
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 Sekunden
die tail
ist nur etwas kürzer.
Hinweis: das verwendete Suffix g
und G
unterscheiden sich je nach Befehl (Ubuntu 15.10)
Lösung 3:
Dies beantwortet nicht die Titelfrage, aber es wird das tun, was Sie tun möchten. Verwenden Sie tac, um die Datei umzukehren, und verwenden Sie dann 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 sie die bekannte Anzahl von Vorkommen findet. Auf diese Weise wird es immer noch gefunden, wenn Ihre Annahme darüber, wo es sich in der Datei befindet, falsch ist. Wenn Sie es einschränken möchten, können Sie dies mit head tun. Der Head-Befehl würde zwischen tac und grep stehen.
Der Befehl sieht also so aus:
tac < logfile | grep myString