Zu Steves hervorragender Antwort hinzufügen.
Es ist vielleicht nicht allgemein bekannt, aber grep ist fast immer schneller, wenn nach einer längeren Pattern-Zeichenfolge gesucht wird als nach einer kurzen, da Boyer-Moore in einem längeren Pattern in längeren Schritten vorwärts springen kann, um noch bessere sublineare Geschwindigkeiten zu erzielen :
Beispiel:
# after running these twice to ensure apples-to-apples comparison
# (everything is in the buffer cache)
$ time grep -c 'tg=f_c' 20140910.log
28
0.168u 0.068s 0:00.26
$ time grep -c ' /cc/merchant.json tg=f_c' 20140910.log
28
0.100u 0.056s 0:00.17
Die längere Form ist 35% schneller!
Woher? Boyer-Moore erstellt aus der Musterzeichenfolge eine Sprung-Vorwärts-Tabelle. Wenn eine Nichtübereinstimmung vorliegt, wird der längste mögliche Sprung (vom letzten zum ersten Zeichen) ausgewählt, bevor ein einzelnes Zeichen in der Eingabe mit dem Zeichen in der Sprung-Tabelle verglichen wird.
Hier ist ein Video, das Boyer Moore erklärt (Dank an kommradHomer)
Ein weiteres häufiges Missverständnis (für GNU grep) ist, dass fgrep
es schneller ist als grep
. f
in fgrep
steht nicht für 'schnell', sondern für 'fest' (siehe Manpage), und da beide dasselbe Programm sind und beide Boyer-Moore verwenden , gibt es keinen Unterschied in der Geschwindigkeit zwischen ihnen bei der Suche nach fest- Zeichenfolgen ohne reguläre Zeichen. Der einzige Grund , warum ich Gebrauch fgrep
ist , wenn es gibt ein regexp spezielles Zeichen (wie .
, []
, oder *
) Ich will sich nicht als solche interpretiert werden. Und selbst dann wird die tragbarere / Standardform von grep -F
bevorzugt fgrep
.