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