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
@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
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.
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!
LC_ALL=C grep
kann es beschleunigen.grep
Ausdruck auswählen ... Wildcards mit unbekannter Länge (wiea.*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).Antworten:
Ich denke, Sie könnten tail verwenden, um nur die letzten 4 GB auszugeben, indem Sie den
-c
Schalter verwendenSie könnten wahrscheinlich auch mit dd etwas anfangen, indem Sie den Offset einstellen
bs=1
und einstellenskip
, den Sie starten möchten, zquelle
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.
Ich habe auch einen sehr rudimentären Benchmark für dieselbe Datei durchgeführt. Ich habe getestet:
das
tail
ist nur ein bisschen kürzer.NB: das verwendete Suffix
g
und derG
Unterschied pro Befehl (Ubuntu 15.10)quelle
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:
quelle
tac
, also danke!