Каково различие между 'grep', 'egrep', и 'fgrep'?

Одной из хороших вещей о vi является своя логическая структура команды. d сопровождаемый командой движения удаляет к цели того движения. $ перемещения в конец строки (мнемосхема: как в regexps). Так d$ удаляет в конец строки. Точно так же e перемещения в конец текущего слова, и w перемещения к началу следующего слова; так de удаляет конец текущего слова, и dw дополнительно удаляет следующий пробел.

281
08.01.2017, 23:57
5 ответов
  • egrep 100%-й эквивалент grep -E
  • fgrep 100%-й эквивалент grep -F

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

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

-E, --extended-regexp
Интерпретируйте ШАБЛОН как расширенное регулярное выражение

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

-F, --fixed-strings
Интерпретируйте ШАБЛОН как список фиксированных строк, разделенных новыми строками, любая из которых должна быть подобрана.

Вот некоторые сценарии в качестве примера:

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

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

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

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

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

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

    grep '^no\(fork\|group\)' /etc/group
    
300
27.01.2020, 19:26
  • 1
    Некоторые системы не имеют egrep или fgrep; -E и -F являются стандартными. Существуют на самом деле маленькие несовместимости в egrep: это рассматривает { немного по-другому. –  Gilles 'SO- stop being evil' 04.08.2011, 02:59
  • 2
    fgrep использует бэкенд Aho-Corasick, в то время как grep использует измененную версию Commentz-Walter. Это означает это grep имеет худший случай O (млн) сложность в то время как fgrep в худшем случае O (m+n). –  Slater Victoroff 26.06.2015, 23:53
  • 3
    Gilles ошибки "напротив понедельник Капитан", некоторые системы (более старый, возможно) не могут иметь-F опции к стандарту grep, но иметь fgrep, некоторые люди, жалуются на это на исходном потоке, что я нашел об использовании grep для специальных символов –  THESorcerer 25.10.2015, 11:36

От man grep:

 egrep is the same as grep -E.
 fgrep is the same as grep -F.  Direct invocation as either egrep  or  
  fgrep  is  deprecated,  but  is provided to allow historical applications
  that rely on them to run unmodified.

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

Вы используете egrep или grep -E если необходимо использовать расширенный regexp.

33
27.01.2020, 19:26

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

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

14
27.01.2020, 19:26
  • 1
    хорошо, но что такое расширенное регулярное выражение? Это действительно не объясняет ниже. Несколько примеров были бы хороши... –  isomorphismes 27.08.2014, 00:05
  • 2
    @isomorphismes: Эта ссылка Викиучебника объясняет это приятно... –  zb226 18.02.2016, 11:38

От "человека grep":

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

8
27.01.2020, 19:26
  • 1
    Вопрос просит подходящий пример. –  isomorphismes 27.08.2014, 00:05

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

Что касается разницы между EXEP и GREP, я думаю, что egeep - большую часть времени, которое вы хотите. Ручной участок GNU перечисляет различия между GreeP и EXEP, который, похоже, лежит в синтаксисе: некоторые вещи требуют косых, в то время как другие не делают. Я думаю, что egeeP более «совместим» с Perl Regexps и JavaScript Regexps, поэтому мне легче использовать EXEP.

кстати. Я действительно поощряю вас дать ACK ACK . Немного проще набрать ACK, чем Greep -e).

3
27.01.2020, 19:26

Теги

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