Quais são as vantagens, se houver grep sobre egrep

4

Estou apenas aprendendo sobre a família grep de programas, e parece-me que o egrep é estritamente superior ao grep - ele pode fazer tudo que o grep pode fazer, mas mais. Estou errado? Por que não usar o egrep sempre?

EDIT: Eu sei que grep -E é o mesmo que egrep. Eu quero saber por que o grep -E não é o modo padrão para o grep, já que ele apenas expande sua usabilidade e não tem desvantagens aparentes.

    
por MYV 29.05.2013 / 01:52

4 respostas

16

Resposta técnica: tradicionalmente, egrep usava um autômato finito determinístico (DFA) internamente, enquanto grep usava um autômato finito não determinístico (NFA). Atualmente, o GNU grep e o egrep adotam uma abordagem híbrida de NFA / DFA.

De acordo com o livro de Friedl Mastering Regular Expressions , para descobrir se o seu egrep (por exemplo) tem um Motor NFA ou se tiver um mecanismo DFA, tente:

echo =XX========================================= | egrep 'X(.+)+X'

Freidl (p.147) diz:

If it takes a long time to finish, it's an NFA ... If it finishes quickly, it's either a DFA or an NFA with some advanced optimization. Does it display a warning message about a stack overow or long match aborted? If so, it's an NFA.

Friedl descreve o mecanismo NFA como "dirigido por regex" e o DFA como "dirigido por texto". Os detalhes da distinção são descritos da p.153 do seu livro em diante.

A consequência é que existem algumas combinações de padrão / texto que são correspondidas mais rapidamente por um DFA e algumas que são correspondidas mais rapidamente por um NFA. Além disso, a maneira como você escreve um regex para um NFA pode ter um efeito significativo na velocidade de correspondência. Geralmente, um DFA é mais rápido, mas os DFAs não oferecem suporte a lazy matching, eles são diferentes em alguns casos, não podem fazer expressões de referência ou referências anteriores e omitem alguns outros recursos em comparação com os NFAs.

De acordo com Freidl, o GNU grep usa um DFA quando possível e reverte para um NFA quando referências anteriores são usadas.

    
por 29.05.2013 / 02:36
2

A "família" é apenas um atalho para diferentes opções grep (de man grep ):

In addition, three variant programs egrep, fgrep and rgrep are available. egrep is the same as grep -E. fgrep is the same as grep -F. rgrep is the same as grep -r. Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.

   -E, --extended-regexp
          Interpret  PATTERN  as  an  extended   regular
          expression (ERE, see below).  (-E is specified
          by POSIX.)

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed  strings,
          separated  by  newlines, any of which is to be
          matched.  (-F is specified by POSIX.)

   -R, -r, --recursive
          Read   all   files   under   each   directory,
          recursively;  this  is  equivalent  to  the -d
          recurse option.
    
por 29.05.2013 / 02:08
1

egrep é apenas um atalho para grep -E , que permite o uso de expressões regulares estendidas. Confira a página de manual para egrep - ele irá acessar a página de manual para a "família" de funções de busca de padrão como grep, egrep, fgrep, etc.

Quanto ao uso, se você usar expressões regulares estendidas, digitar egrep poderá ser mais rápido do que digitar grep -E o tempo todo.

    
por 29.05.2013 / 02:00
0

A desvantagem de egrep é que sua regex é um pouco mais complexa e menos conveniente se você não precisar da capacidade extra. Às vezes, mais energia não é melhor se não for tão simples e fácil de usar.

    
por 29.05.2013 / 03:51