it-swarm-eu.dev

Jaký je rozdíl mezi "grep", "egrep" a "fgrep"?

Může mi někdo říct technické rozdíly mezi grep, egrep a fgrep a uvést vhodné příklady?

Kdy musím použít grep přes egrep a naopak?

287
mr_eclair
  • egrep je 100% ekvivalentní grep -E
  • fgrep je 100% ekvivalentní grep -F

Historicky byly tyto přepínače poskytovány v samostatných binárních souborech. U některých opravdu starých unixových systémů zjistíte, že musíte zavolat samostatné binární soubory, ale u všech moderních systémů jsou přepínače preferovány. Manová stránka grepu obsahuje podrobnosti.

Co se děje, -E přepne grep do zvláštního režimu, takže výraz je vyhodnocen jako ERE (Extended Regular Expression) na rozdíl od jeho normálního přizpůsobení vzoru. Podrobnosti o této syntaxi jsou na stránce man.

-E, --extended-regexp
Interpretovat PATTERN jako rozšířený regulární výraz

The -F přepínač přepne grep do jiného režimu, kde přijímá vzor, ​​který odpovídá, ale pak rozdělí tento vzorec do jednoho vyhledávacího řetězce na řádek a provede OR vyhledávání na kterémkoli z řetězců bez provedení) jakákoli speciální shoda vzorů.

-F, --fixed-strings
Interpretovat PATTERN jako seznam pevných řetězců oddělených novými řádky, z nichž každý musí být uzavřen.

Zde je několik příkladů:

  • Máte soubor se seznamem deseti uživatelských jmen Unixu v prostém textu. Chcete prohledat soubor skupiny v počítači a zjistit, zda některý z deseti uvedených uživatelů není v nějaké zvláštní skupině:

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

    Důvod -F Přepínač pomáhá zde je, že uživatelská jména v souboru se vzorem jsou interpretována jako řetězce prostého textu. Například tečky by byly interpretovány spíše jako tečky než divoké karty.

  • Chcete hledat pomocí efektního výrazu. Například závorka () lze použít k označení skupin pomocí | použito jako operátor OR). Toto vyhledávání můžete spustit pomocí -E:

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

    ... pro vrácení řádků začínajících buď „nofork“ nebo „nogroup“. Bez -E přepínač, měli byste uniknout zahrnutým zvláštním znakům, protože při normální shodě vzoru by jen hledali ten přesný vzor;

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

Z man grep:

 egrep je stejný jako grep -E. 
 fgrep je stejný jako grep -F. Přímé vyvolání jako egrep nebo 
 Fgrep je zastaralé, ale je poskytováno, aby umožnilo historickým aplikacím 
, Které se na ně spoléhají, běžet beze změny. 

Používáte fgrep nebo grep -F pokud nechcete chcete, aby byl grepped řetězec interpretován jako vzor.

Používáte egrep nebo grep -E pokud potřebujete použít rozšířenou regexp.

33
rozcietrzewiacz

egrep a fgrep jsou v podstatě rovnocenné s grep -E a grep -F (příslušně):

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

Chybové zprávy se však mohou lišit.

15

Z „man grep“:

k dispozici jsou tři varianty programů egrep, fgrep a rgrep. egrep je stejný jako grep -E. fgrep je stejné jako grep -F. rgrep je stejný jako grep -r. Přímé vyvolání jako egrep nebo fgrep je zastaralé, ale je poskytováno, aby historické aplikace, které se na ně spoléhají, mohly běžet beze změny.

8
Rufo El Magufo

Pokud hledáte doslovný řetězec a chcete si být jisti, že řetězec, který jste předali, je interpretován doslovně (tj. Aniž byste riskovali, že se tečka nebo otazník bude interpretovat jako něco jiného), použijte fgrep nebo egrep -F.

Pokud jde o rozdíl mezi egrep a grep, myslím, že egrep je většinou to, co chcete. The GNU manuální stránka uvádí rozdíly mezi grep a egrep, které se zdají ležet v syntaxi: některé věci vyžadují lomítka, zatímco jiné ne. Myslím, že egrep je více „kompatibilní“ s regulárními výrazy Perl a javascript, takže je pro mě jednodušší používat egrep.

Mimochodem. Opravdu vás vyzývám, abyste zkusili ack vyzkoušejte - podporuje PREG a má užitečnější výchozí hodnoty (tj. Zbarvení, přeskakování adresářů pravděpodobně ne-co-vy, jako .svn, schopnost sledovat symlinks, a je o něco snazší psát ack než grep -E).

3
qbolec