Яка різниця між `grep`,` egrep` та `fgrep`?


273

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

Коли мені потрібно використовувати grepбільше egrepі навпаки?


7
superuser має чудову ілюстрацію відмінностей між grep, egrep, fgrep та pgrep: superuser.com/questions/508881/…
— Ерік Лещинський

Відповіді:


292
  • egrep становить 100% еквівалент grep -E
  • fgrep становить 100% еквівалент grep -F

Історично ці комутатори забезпечувалися окремими бінарними файлами. У деяких дійсно старих системах Unix ви побачите, що вам потрібно викликати окремі бінарні файли, але у всіх сучасних системах комутатори є кращими. Сторінка man для grep містить детальну інформацію про це.

Що стосується того, що вони роблять, -Eперемикання grep в спеціальний режим, щоб вираз оцінювався як ERE (Extended Regular Expression) на відміну від його звичайного узгодження шаблону. Деталі цього синтаксису розміщені на сторінці man.

-E, --extended-regexp
Інтерпретувати PATTERN як розширений регулярний вираз

-FПеремикач перемикає Grep в інший режим , в якому він бере шаблон , щоб відповідати, але потім розщеплює цей шаблон вгору в одній пошукового рядка в кожному рядку і робить пошук або на будь-який з рядків , не роблячи будь - яких спеціальних зіставлення з зразком.

-F, --fixed-strings
Інтерпретувати PATTERN як список фіксованих рядків, розділених новими рядками, будь-який з яких повинен відповідати.

Ось кілька прикладних сценаріїв:

  • У вас є файл із переліком, наприклад, десяти імен користувачів 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
    

17
У деяких системах немає egrepабо fgrep; -Eі -Fє стандартними. У насправді є невеликі несумісності egrep: вона трактується {дещо інакше.
— Жиль

4
fgrepвикористовує сервер Aho-Corasick, тоді як grepвикористовує модифіковану версію Commentz-Walter. Це означає, що grepв гіршому випадку fgrepє складність O (mn), а в гіршому - O (m + n).
— Слейтер Вікторофф

2
Gilles "au contraire mon capitan", деякі системи (можливо, старші) можуть не мати -F варіант для стандартного grep, але мають fgrep, деякі ppl скаржаться на це в оригінальній темі, яку я знайшов про використання grep для спеціальних символів
— THESorcerer,

Нещодавно я трапився в системі Android, на якій egrepі grep -Eоброблялися різні виконувані файли, BusyBox та BSD grep. Два варіанти мали поведінкові відмінності для негенеруючих конструкцій, не таких як Posix, наприклад \s. Це призвело до великої плутанини ...
— Лій

33

Від man grep:

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

Ви використовуєте fgrepабо, grep -Fякщо ви не хочете, щоб переплетений рядок інтерпретувався як шаблон.

Ви використовуєте egrepабо grep -Eякщо вам потрібно використовувати розширений регулярний вираз.


13

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

Повідомлення про помилки можуть відрізнятися.


2
добре, але що таке розширений регулярний вираз? Це насправді не пояснюється нижче. Кілька прикладів було б непогано ...
— isomorphismes

@isomorphismes: Це посилання на wikibooks добре пояснює це ...
— zb226

8

Від "man grep":

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


2
Питання задає відповідний приклад.
— ізоморфізми

3

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

Що стосується різниці між egrep та grep, я думаю, що egrep - це більшість часу, що ви хочете. На веб-сайті посібника GNU перераховані відмінності між grep та egrep, які, здається, є в синтаксисі: деякі речі вимагають косої риски, а інші -. Я думаю, що egrep більше "сумісний" з regexps perl та jage regexps, тому мені простіше використовувати egrep.

Btw. Я дійсно закликаю вас , щоб дати вивів спробувати - він підтримує PREGs, і має більш корисні значення по замовчуванням (тобто забарвлення, пропуск , ймовірно, не що-ви-хочете каталоги , як .svn, здатність слідувати символічні посилання, і це трохи простіше набрати ack ніж grep -E).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.