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

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

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

228 голосов | спросил mr_eclair 3 PM00000010000000431 2011, 13:05:04

5 ответов


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

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

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

  

-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
    
ответил Caleb 3 PM00000010000002031 2011, 13:09:20
28

Из man grep:

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

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

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

ответил rozcietrzewiacz 3 PM00000010000004031 2011, 13:11:40
12

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

 -E, --extended-regexp
          Интерпретировать PATTERN как расширенное регулярное выражение (ERE, см.
          ниже). (-E задается POSIX.)

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

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

ответил Stéphane Gimenez 3 PM00000010000003331 2011, 13:10:33
8

От "man grep":

  

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

ответил Rufo El Magufo 3 PM00000010000002631 2011, 13:08:26
2

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

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

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

ответил qbolec 29 Jpm1000000pmThu, 29 Jan 2015 15:31:35 +030015 2015, 15:31:35

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132