Каковы преимущества, если какой-либо из grep над egrep

1392
MYV

Я просто изучаю семейство программ grep, и мне кажется, что egrep строго превосходит grep - он может делать все, что может делать grep, но больше. Я ошибся? Почему бы просто не использовать egrep каждый раз?

РЕДАКТИРОВАТЬ: я знаю, что grep -E это то же самое, что egrep. Я хочу знать, почему grep -E не является режимом по умолчанию для grep, поскольку он только расширяет возможности его использования и не имеет явных недостатков.

4

4 ответа на вопрос

16
Simon

Technical answer: traditionally, egrep used a deterministic finite automaton (DFA) internally while grep used a non-deterministic finite automaton (NFA). These days, GNU grep and egrep take a hybrid NFA/DFA approach.

According to Friedl's book Mastering Regular Expressions, to discover if your egrep (for example) has an NFA engine or if it has a DFA engine try:

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

Freidl (p.147) says:

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 describes the NFA engine as "regex-directed" and the DFA as "text-directed". The details of the distinction are described from p.153 of his book onwards.

The consequence is that there are some pattern/text combinations that are matched more quickly by a DFA and some that are matched more quickly by an NFA. Also, the way you write a regex for an NFA can have a significant effect on the speed of matching. Often, a DFA will be faster, but DFAs do not support lazy matching, they match differently in some cases, they cannot do look-around expressions or back-references, and they omit some other features compared to NFAs.

According to Freidl, GNU grep uses a DFA when possible and reverts to an NFA when back-references are used.

В фрагменте кода это должно быть «egrep» или «grep»? То, что вы написали, "egrep = DFA", поэтому не должно занять много времени, чтобы закончить, как "egrep! = NFA". Nevin Williams 11 лет назад 0
Я думаю, что Friedl означает, что в примере показано, использует ли `egrep` в этом случае (или` grep`, если вы заменили `egrep` на` grep`), использование DFA или NFA. Учитывая, как отмечалось в других ответах, что разные реализации одного и того же инструмента могут использовать разные движки регулярных выражений, тот факт, что данный инструмент традиционно использует конкретный движок, не означает, что в конкретной реализации этого инструмента обязательно используется один и тот же тип движка. Simon 11 лет назад 0
2
terdon

The "family" are each just shortcuts to different grep options (from 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. 
1
InnerPortal

egrep is just a shortcut for grep -E which allows the usage of extended regular expressions. Check out the man page for egrep– it will pull up the man page for the "family" of pattern search functions like grep, egrep, fgrep, etc.

As for usage, if you use extended regular expressions, then typing egrep might be faster that typing in grep -E all the time.

0
Nicole Hamilton

The drawback to egrep is that its regex is a little more complex and less convenient if you don't need the extra capability. Sometimes, more power isn't better if it's not as simple and easy to use.

Похожие вопросы