Pour ajouter à Steve excellente réponse.
Il peut ne pas être connu de tous, mais la commande grep est presque toujours plus rapide lorsque grepping pour une plus longue motif de chaîne que de courte durée, car, en plus de modèle, de Boyer-Moore pouvez sauter en avant dans une foulée plus longue à atteindre, même mieux sublinéaire vitesses:
Exemple:
# 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
La forme longue est de 35% plus rapide!
Comment venir? Boyer-Moore consructs un skip-avant le tableau de la structure de la chaîne, et chaque fois qu'il y a une incompatibilité, il choisit le plus long saut possible (depuis le dernier char de première) avant de comparer un seul char, à l'entrée de l'omble chevalier dans le saut de la table.
Voici une vidéo expliquant Boyer Moore
Une autre idée fausse commune (pour GNU grep) est qu' fgrep
plus rapide que de l' grep
. f
en fgrep
ne pas défendre "rapide", ça signifie "fixe" (voir la page de man), et puisque les deux sont le même programme, et les deux utilisent Boyer-Moore, il n'y a pas de différence de vitesse entre eux lors de la recherche pour les chaînes de caractères sans regexp de caractères spéciaux. La seule raison pour laquelle j'utilise fgrep
, c'est quand il y a une regexp un caractère spécial (comme .
, []
ou *
) je ne veux pas être interprétés comme tels. Et même alors, le plus portable/forme standard de l' grep -F
qui est privilégiée fgrep
.