Яка різниця між `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.