Чтобы добавить к отличному ответу Стива.
Возможно, это не широко известно, но grep почти всегда работает быстрее при поиске более длинной строки шаблона, чем короткой, потому что в более длинном шаблоне Бойер-Мур может пропустить вперед более длинными шагами, чтобы достичь еще лучших сублинейных скоростей:
Пример:
# 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
Более длинная форма на 35% быстрее!
Как придешь? Бойер-Мур составляет таблицу перехода вперед из строки шаблона, и всякий раз, когда есть несоответствие, он выбирает самый длинный возможный пропуск (от последнего символа к первому), прежде чем сравнивать один символ во входных данных с символом в таблице пропуска.
Вот видео, объясняющее Бойера Мура (Кредит kommradHomer)
Другое распространенное заблуждение (для GNU grep) заключается в том, что fgrep
он быстрее, чем grep
. f
in fgrep
не означает «быстро», это означает «фиксированный» (см. справочную страницу), и поскольку обе являются одной и той же программой и обе используют Бойера-Мура , между ними нет разницы в скорости при поиске фиксированных - строки без специальных символов регулярного выражения. Единственная причина , почему я использовать fgrep
, когда есть регулярное выражение специальный символ (например .
, []
или *
) Я не хочу, чтобы это было истолковано как таковой. И даже тогда более портативная / стандартная форма grep -F
предпочтительнее fgrep
.