Я использую egrep ( grep -E
) с файлом PATTERN. ( -f path/to/file
).
Это делается в бесконечном цикле в потоке текста. Это означает, что я не могу накапливать и передавать ВСЕ входные данные в grep одновременно (как *.log
).
Есть ли способ заставить grep "сохранить" NFA, которую он создает из файла PATTERN, чтобы использовать его для следующего запуска?
Я искал Google и прочитал документацию без удачи.
Я постараюсь объяснить это немного больше. Мне нужно найти фиксированное количество строк с помощью регулярных выражений (это не является частью вопроса, но вы можете предложить иное), таких как IP-адреса, домены и т. Д. Поиск осуществляется по каналу из Интернета. Вы можете думать об этом как о текстовом потоке. Я не могу использовать grep
все входные данные, так как это поток. Я могу накопить кусок потока и использовать grep
его (таким образом, не используяgrep
в каждой строке), но это также ограничено (скажем, в течение 30 секунд).
Я знаю grep
, строит NFA из всех его шаблонов (в моем случае из файла). Итак, мой вопрос здесь: могу ли я grep
сохранить этот NFA для следующего запуска, поскольку он не изменится? Это сэкономило бы мне время на создание этого NFA каждый раз.
grep
на строку текста? Откуда приходит текст? Былtail -f
бы вариант?grep
этот фрагмент.grep
несколько раз. Возможно, связано: Почему сопоставление 1250 строк с образцами 90 КБ происходит так медленно?grep
предназначен для работы с потоком текста, я до сих пор не понимаю, зачем вам нужно запускать несколько экземпляров. Почему вы не можете накормить всех этих в одномgrep
экземпляре? Зачем вам их накапливать перед кормлениемgrep
?Ответы:
Нет, такого нет. Как правило, стоимость запуска
grep
(разветвления нового процесса, загрузки исполняемого файла, разделяемой библиотеки, динамического связывания ...) была бы намного выше, чем компиляция регулярных выражений, поэтому такая оптимизация была бы бессмысленной.Хотя посмотрите, почему сопоставление 1250 строк с образцами 90 КБ так медленно? об ошибке в некоторых версиях GNU
grep
, которая делает его особенно медленным для большого количества регулярных выражений.Возможно, здесь вы могли бы избежать запуска
grep
несколько раз, подавая свои куски в один и тот жеgrep
экземпляр, например, используя его как совместный процесс и используя маркер для определения конца. Сzsh
и GNUgrep
иawk
реализации, кромеmawk
:Хотя может быть проще сделать все это с
awk
илиperl
вместо.Но если вам не нужно
grep
выводить данные в разные файлы для разных кусков, вы всегда можете сделать:источник
grep
как есть. Спасибо.Вы знаете, что блокируют трубопроводы? Если вы передадите что-то в grep и все входные данные будут недоступны, grep будет ждать, пока это не станет доступным, а затем продолжит, как если бы вход был там все время.
РЕДАКТИРОВАТЬ: Как конвейеры работают, например, с тем
cmd1 | cmd2
, что обе программы будут запускаться одновременно, например, между ними 65356-байтовый «буфер чанка». Когдаcmd2
попытка чтения и этот буфер пуст, он будет ждать, пока блок не будет доступен. Когдаcmd1
попытка записи и этот буфер заполнен, он будет ждать, покаcmd2
его не прочитает.Из того, что я могу прочитать, нет необходимости разрезать входные данные на куски и передавать их в grep отдельно. Это уже сделано автоматически.
EDIT2:
grep
также должен распечатать результаты, как только он найдет их в потоке. Нет необходимости завершать поток, прежде чем вы сможете получить свои результаты.источник
Может быть, вы можете «использовать grep на всех входах»? Используя
nc
(netcat), или черезscript
, или через другие, подобные инструменты? Особенно, если ваш файл шаблонов имеет управляемый размер (скажем, менее 1000 регулярных выражений).Первый пример : Вы можете
egrep
подключиться к потоковому соединению: (здесь показан примерnc
, но могут применяться и другие)(примечание: вы можете даже:
touch /some/path/results.gz
перед запускомnc
команды и иметьtail -f
в этом (пустом) файле ничего не пропустить. В любом случае results.gz будет содержать все, что вы хотели поймать)Второй пример : Вы могли бы даже
egrep
в текущем сеансе оболочки (и показать другой способ следовать прогрессии):egrep
является высокоэффективной версией дляgrep
большинства систем (см. интересную информацию по адресу : https://swtch.com/~rsc/regexp/regexp1.html ).источник
s
намного медленнее, чем сопоставление,something
и это намного медленнее сопоставленияsomething even much longer
(последний позволяет совпадению регулярного выражения пропускать больше части входных данных при различиях.) В больших файлах он в основном «делит» время, чтобы проанализировать его на соотношение длины (т. е. поиск одного известного символа почти в 40 раз медленнее, чем сопоставление строки из 40 известных символов. но это действительно заметно.)