Quelquun 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?

Commentaires

Réponse

Historiquement, ces commutateurs étaient fournis dans des binaires séparés. Sur certains systèmes Unix très 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 quils font, -E fait passer grep dans un mode spécial afin que lexpression soit évaluée comme une ERE (Extended Regular Expression) par opposition à sa normale correspondance de modèle. Les détails de cette syntaxe se trouvent sur la page de manuel.

-E, --extended-regexp
Interpréter PATTERN comme un régulier étendu expression

Le commutateur -F fait basculer grep dans un mode différent où il accepte un modèle correspondant, mais alors divise ce modèle en une chaîne de recherche par ligne et effectue une recherche OR sur lune des chaînes sans faire de correspondance de modèle spéciale.

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

Voici quelques exemples de scénarios:

  • Vous avez un fichier avec une liste de dix noms dutilisateurs Unix en texte brut. Vous souhaitez rechercher le fichier de groupe sur votre ordinateur pour voir si lun des dix utilisateurs répertoriés fait partie de groupes spéciaux:

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

    La raison pour laquelle -F le commutateur aide ici est que les noms dutilisateur 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 comme des caractères génériques.

  • Vous souhaitez effectuer une recherche en utilisant une expression sophistiquée. Par exemple, les parenthèses () peuvent être utilisées pour indiquer des groupes avec | utilisé comme opérateur OR. Vous pouvez exécuter cette recherche en utilisant -E:

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

    … pour renvoyer les lignes commençant par « nofork « ou » nogroup « . Sans le commutateur -E, vous auriez à échapper les caractères spéciaux impliqués car avec une correspondance de modèle normale, ils chercheraient simplement ce modèle exact;

    grep "^no\(fork\|group\)" /etc/group 

Commentaires

  • Certains systèmes ne ‘ ont egrep ou fgrep; -E et -F sont standard. Il y a en fait de petites incompatibilités dans egrep: il traite { légèrement différemment.
  • fgrep utilise le backend Aho-Corasick, tandis que grep utilise une version modifiée de Commentz-Walter. Cela signifie que grep a une complexité O (mn) dans le pire des cas tandis que fgrep est au pire O (m + n).
  • Gilles  » au contraire mon capitan « , certains systèmes (peut-être plus anciens) peuvent ne pas avoir loption -F du grep standard mais avoir un fgrep, certains ppl se plaignent de cela sur le fil dorigine que jai trouvé sur lutilisation de grep pour les caractères spéciaux
  • Je suis récemment tombé sur un système Android sur lequel egrep et grep -E étaient gérés par différents exécutables, BusyBox et BSD grep. Les deux variantes avaient des différences de comportement pour les constructions regex non Posix, telles que \s. Cela a conduit à beaucoup de confusion …

Réponse

De man grep:

 egrep is the same as grep -E. fgrep is the same as grep -F. Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified. 

Vous utilisez fgrep ou grep -F si vous ne « t voulez pas que la chaîne grepped soit interprétée comme un modèle.

Vous utilisez egrep ou grep -E si vous avez besoin dutiliser une expression régulière étendue.

Réponse

egrep et fgrep sont fondamentalement é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 derreur peuvent cependant différer.

Commentaires

  • ok, mais quest-ce que est une expression régulière étendue? Cela ne ‘ pas vraiment expliquer ci-dessous. Quelques exemples seraient bien …
  • @isomorphismes: Ce lien wikibooks lexplique joliment …

Réponse

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. Lappel direct comme egrep ou fgrep est obsolète, mais est fourni pour permettre aux applications historiques qui en dépendent de sexécuter sans modification.

Commentaires

  • La question demande un exemple approprié.

Réponse

Si vous recherchez une chaîne verbatim, et voulez être sûr que la chaîne que vous avez passée est interprétée textuellement (cest-à-dire sans risquer que dire quun point ou un point dinterrogation 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 ce que vous voulez. Le site du manuel GNU répertorie les différences entre grep et egrep qui semblent résider dans la syntaxe: certaines choses nécessitent des barres obliques, dautres non. Je pense que egrep est plus « compatible » avec les expressions rationnelles perl et javascript, donc il mest plus facile dutiliser egrep.

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *