web-dev-qa-db-fra.com

Quelle est la différence entre `grep`,` egrep` et `fgrep`?

Quelqu'un peut-il me dire les différences techniques entre grep, egrep et fgrep et fournir des exemples appropriés?

Quand dois-je utiliser grep sur egrep et vice versa?

287
mr_eclair
  • egrep est 100% équivalent à grep -E
  • fgrep est 100% équivalent à grep -F

Historiquement, ces commutateurs étaient fournis dans des fichiers binaires séparés. Sur certains systèmes Unix vraiment anciens, vous constaterez que vous devez appeler les binaires séparés, mais sur tous les systèmes modernes, les commutateurs sont préférés. La page de manuel de grep contient des détails à ce sujet.

Quant à ce qu'ils font, -E bascule grep dans un mode spécial afin que l'expression soit évaluée comme une ERE (Extended Regular Expression) par opposition à sa correspondance de modèle normale. Les détails de cette syntaxe se trouvent sur la page de manuel.

-E, --extended-regexp
Interpréter le MOTIF comme une expression régulière étendue

Le -F switch bascule grep dans un mode différent où il accepte un modèle à faire correspondre, mais divise ensuite ce modèle en une chaîne de recherche par ligne et effectue une recherche OR sur l'une des chaînes sans faire toute correspondance de motif spécial.

-F, --fixed-strings
Interpréter PATTERN comme une liste de chaînes fixes, séparées par des sauts de ligne, dont chacune doit être mise en correspondance.

Voici quelques exemples de scénarios:

  • Vous avez un fichier avec une liste de disons dix noms d'utilisateur Unix en texte brut. Vous souhaitez rechercher le fichier de groupe sur votre machine pour voir si l'un des dix utilisateurs répertoriés se trouve dans des groupes spéciaux:

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

    La raison pour laquelle le -F switch aide ici, c'est que les noms d'utilisateur dans votre fichier de modèle sont interprétés comme des chaînes de texte brut. Les points par exemple seraient interprétés comme des points plutôt que des caractères génériques.

  • Vous souhaitez effectuer une recherche à l'aide d'une expression de fantaisie. Par exemple, la parenthèse () peut être utilisé pour indiquer les groupes avec | utilisé comme opérateur OR. Vous pouvez exécuter cette recherche à l'aide de -E:

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

    ... pour renvoyer des lignes commençant par "nofork" ou "nogroup". Sans le -E switch, vous devrez échapper aux caractères spéciaux impliqués car avec une correspondance de modèle normale, ils rechercheraient simplement ce modèle exact;

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

De man grep:

 egrep est identique à grep -E. 
 fgrep est identique à grep -F. L'invocation directe en tant qu'egrep ou 
 Fgrep est déconseillée, mais est fournie pour permettre aux applications historiques 
 Qui s'appuient sur elles de s'exécuter sans modification. 

Vous utilisez fgrep ou grep -F si vous ne pas voulez que la chaîne greffée soit interprétée comme un motif.

Vous utilisez egrep ou grep -E si vous devez utiliser une expression rationnelle étendue.

33
rozcietrzewiacz

egrep et fgrep sont essentiellement équivalents à grep -E et grep -F (respectivement):

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

Les messages d'erreur peuvent cependant différer.

15
Stéphane Gimenez

De "man grep":

trois variantes de programmes egrep, fgrep et rgrep sont disponibles. egrep est identique à grep -E. fgrep est identique à grep -F. rgrep est identique à grep -r. L'invocation directe comme egrep ou fgrep est déconseillée, mais est fournie pour permettre aux applications historiques qui en dépendent de s'exécuter sans modification.

8
Rufo El Magufo

Si vous recherchez une chaîne textuelle et que vous voulez vous assurer que la chaîne que vous avez passée est interprétée textuellement (c'est-à-dire sans risquer de dire qu'un point ou un point d'interrogation sera interprété comme autre chose), utilisez fgrep ou egrep -F.

Quant à la différence entre egrep et grep, je pense que egrep est la plupart du temps la chose que vous voulez. Le site GN répertorie les différences entre grep et egrep qui semblent résider dans la syntaxe: certaines choses nécessitent des barres obliques tandis que d'autres ne le font pas. Je pense que egrep est plus "compatible" avec les expressions rationnelles Perl et les expressions régulières javascript, il est donc plus facile pour moi d'utiliser egrep.

Btw. Je vous encourage vraiment à essayer ack - il prend en charge les PREG et a des valeurs par défaut plus utiles (c'est-à-dire la coloration, le saut de répertoires probablement pas ce que vous voulez comme .svn, la possibilité de suivre les liens symboliques, et il est un peu plus facile de taper ack que grep -E).

3
qbolec