Para acrescentar à excelente resposta de Steve.
Pode não ser amplamente conhecido, mas o grep é quase sempre mais rápido ao usar o grep para uma string de padrão mais longa do que uma curta, porque em um padrão mais longo, Boyer-Moore pode pular para frente em passos mais longos para alcançar velocidades sublineares ainda melhores :
Exemplo:
# 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
A forma mais longa é 35% mais rápida!
Por quê? Boyer-Moore constrói uma tabela de salto para a frente da string de padrão e sempre que há uma incompatibilidade, ele escolhe o salto mais longo possível (do último caractere ao primeiro) antes de comparar um único caractere na entrada com o caractere na tabela de salto.
Aqui está um vídeo explicando Boyer Moore (crédito para kommradHomer)
Outro equívoco comum (para GNU grep) é que fgrep
é mais rápido que grep
. f
in fgrep
não significa 'rápido', significa 'fixo' (consulte a página de manual) e, como ambos são o mesmo programa e usam Boyer-Moore , não há diferença de velocidade entre eles ao pesquisar por fixo strings sem caracteres especiais regexp. O único uso razão I fgrep
é quando há um char especial regexp (como .
, []
ou *
) Eu não quero que ele seja interpretado como tal. E mesmo assim a forma mais portátil / padrão de grep -F
é preferível fgrep
.