2015-08-19 3 views
2

Это то, что я имею в виду: grep программа пытается шаблону соответствует каждое вхождение шаблона в строке, точно так же как:«частичный grep» для ускорения скорости grep?

echo "abc abc abc" | grep abc --color 

результатом является то, что три abc все красного цвета, так Grep сделал полный соответствие шаблону линии.

Но думаю, что в этом сценарии у меня есть много больших файлов для обработки, но слова, которые меня интересуют, очень вероятно произойти в первых нескольких словах. Моя задача - найти строки без слов в них. Так что если программа grep может продолжить следующую строку, когда слова были найдены без необходимости проверять остальную часть строки, это может быть значительно быстрее.

Есть ли partial match вариант, возможно, в grep для этого?

нравится:

echo abc abc abc | grep --partial abc --color 

только с первым аЬсом красного цвета.

+1

Скорее всего, единственная причина, по которой 'grep' проверяет всю строку *, потому что * вы используете' --color'. Я был бы удивлен, если «grep» не остановится после первого матча без него, так как строка будет частью вывода независимо от того, сколько раз «abc» соответствует строке. – chepner

+0

Как упоминалось в @chepner, рассмотрите возможность добавления '--color = never' для отключения раскраски. –

ответ

3

Смотрите это хорошее введение в Grep внутренностей:

http://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html

В частности:

GNU Grep ИЗБЕГАЕТ СРЫВАЯ ВХОД НА ЛИНИИ. Поиск новых строк замедлял бы grep в несколько раз, потому что, чтобы найти новые строки, нужно было посмотреть на каждый байт!

Таким образом, вместо того, чтобы использовать строковый ввод, GNU Grep читает исходные данные в большого буфер, поиск буфера с использованием Boyer-Moore, и только тогда, когда он находит совпадение это идти и искать ограничивающие переводы строк. (опции командной строки Некоторые, такие как -n Отключение этой оптимизации.)

Так что ответ: Нет, это способ быстрее grep искать следующее вхождение строки поиска, а не искать новая линия.

Редактировать: В отношении спекуляции в комментариях к этому color=never сделал бы трюк: я быстро взглянул на исходный код. Переменная color_option не используется нигде рядом с фактическим поиском регулярного выражения или предыдущей и будущей новой строки в случае, если совпадение найдено.

Возможно, при поиске этих терминаторов линии можно было бы сохранить несколько циклов процессора. Вероятно, разница в реальном мире проявляется с патологическими длинными строками и очень короткой поисковой строкой.

+0

Nice intro! благодаря –

1

Если ваша задача - найти строки без слов в них, вы можете дать sed попытаться удалить строки, содержащие определенное слово.

sed '/word/d' input_file 

Sed, вероятно, продолжит следующую строку, когда первое вхождение будет найдено на текущей строке.

0

Если вы хотите найти строки без конкретных слов, вы можете использовать grep для этого.

Попробуйте grep -v "abc", что означает сделать обратное. В этом случае найдите строки без строки «abc».

Если у меня есть файл, который выглядит следующим образом:

line one abc 
line two abc 
line three def 

Doing grep -v "abc" file.txt вернется line three def.

Смежные вопросы