it-swarm-ru.tech

В чем разница между `grep`,` egrep` и `fgrep`?

Может кто-нибудь сказать мне технические различия между grep, egrep и ​​fgrep и ​​предоставить подходящие примеры?

Когда мне нужно использовать grep over egrep и ​​наоборот?

287
mr_eclair
  • egrep на 100% эквивалентно grep -E
  • fgrep на 100% эквивалентно grep -F

Исторически эти переключатели были предоставлены в отдельных двоичных файлах. В некоторых действительно старых системах Unix вы обнаружите, что вам нужно вызывать отдельные двоичные файлы, но во всех современных системах предпочтительнее использовать коммутаторы. Страница man для grep содержит подробности об этом.

Что касается того, что они делают, -E переключает grep в специальный режим, чтобы выражение оценивалось как ERE (расширенное регулярное выражение), а не как его обычное сопоставление с образцом. Детали этого синтаксиса находятся на странице руководства.

-E, --extended-regexp
Интерпретировать PATTERN как расширенное регулярное выражение

Переключатель -F переключает grep в другой режим, где он принимает шаблон для сопоставления, но затем разбивает этот шаблон на одну строку поиска в строке и выполняет поиск OR на любой из строк без какого-либо специального сопоставления с образцом.

-F, --fixed-strings
Интерпретировать PATTERN как список фиксированных строк, разделенных символами новой строки, любой из которых должен соответствовать.

Вот несколько примеров сценариев:

  • У вас есть файл со списком, скажем, десяти имен пользователей Unix в виде простого текста. Вы хотите найти файл группы на своем компьютере, чтобы увидеть, входит ли кто-либо из десяти перечисленных пользователей в какие-либо специальные группы:

    grep -F -f user_list.txt /etc/group
    

    Причина, по которой здесь помогает переключатель -F, заключается в том, что имена пользователей в файле шаблона интерпретируются как строки простого текста. Например, точки будут интерпретироваться как точки, а не как символы подстановки.

  • Вы хотите искать, используя причудливое выражение. Например, скобка () может использоваться для обозначения групп с |, используемым в качестве оператора OR. Вы можете запустить этот поиск, используя -E:

    grep -E '^no(fork|group)' /etc/group
    

    ... чтобы вернуть строки, которые начинаются с "nofork" или "nogroup". Без переключателя -E вам пришлось бы избегать задействованных специальных символов, потому что при обычном сопоставлении с образцом они просто искали бы этот точный шаблон;

    grep '^no\(fork\|group\)' /etc/group
    
304
Caleb

От man grep:

 egrep - то же, что grep -E. 
 fgrep - то же самое, что и grep -F. Прямой вызов как egrep или 
 Fgrep устарел, но предоставляется для того, чтобы исторические приложения 
, Которые полагаются на них, работали без изменений. 

Вы используете fgrep или grep -F если вы не хотите, чтобы скопированная строка интерпретировалась как шаблон.

Вы используете egrep или grep -E если вам нужно использовать расширенное регулярное выражение.

33
rozcietrzewiacz

egrep и ​​fgrep в основном эквивалентны grep -E а также grep -F (соответственно):

   -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.)

Сообщения об ошибках могут отличаться.

15
Stéphane Gimenez

От "man grep":

доступны три варианта программы egrep, fgrep и rgrep. egrep такой же, как grep -E. fgrep - это то же самое, что и grep -F. rgrep - это то же самое, что и grep -r. Прямой вызов egrep или fgrep устарел, но предоставляется, чтобы позволить историческим приложениям, которые полагаются на них, работать без изменений.

8
Rufo El Magufo

Если вы ищете дословную строку и хотите быть уверены, что переданная вами строка интерпретируется дословно (то есть, не рискуя тем, что точка или знак вопроса будут интерпретироваться как что-то еще), используйте fgrep или egrep -F.

Что касается разницы между egrep и grep, я думаю, что egrep чаще всего то, что вам нужно. GNU сайт руководства перечисляет различия между grep и egrep, которые, кажется, заключаются в синтаксисе: некоторые вещи требуют косой черты, а другие нет. Я думаю, что egrep больше "совместим" с регулярными выражениями Perl и регулярными выражениями javascript, поэтому мне проще использовать egrep.

Btw. Я настоятельно рекомендую вам попробовать ack - он поддерживает PREG и имеет более полезные значения по умолчанию (например, раскраска, пропуск каталогов, которые, вероятно, не то, что вам нужны, такие как .svn, возможность переходить по символическим ссылкам, и немного легче набрать ack, чем grep -E).

3
qbolec