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 fgrepes schneller ist als grep. fin fgrepsteht 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 fgrepist , 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 -Fbevorzugt fgrep.