85 votes

Différence entre egrep et grep

J'ai une question sur grep et egrep sur unix .

Comme je suis en train d'étudier récemment le shell commands sur unix Je voudrais savoir quelles sont les différences entre grep et egrep.

Je trouve que nous pouvons utiliser grep et egrep avec une expression régulière. Cependant, j'ai trouvé quelque chose de différent entre ces deux commandes :

Pour ^ grep et egrep ont la même signification, à savoir trouver les lignes contenant les éléments donnés au tout début.

Toutefois, pour | grep, sans barre oblique devant l'expression | , signifie caractère de | et si je mets un back slash devant, il active sa signification spéciale qui consiste à trouver la ligne qui contient soit le contenu devant, soit le contenu derrière. MAIS, pour egrep, c'est l'inverse. | a les dernières significations de grep et \| a l'ancienne signification de grep lorsqu'il l'utilise.

Quelqu'un d'autre pourrait-il gentiment expliquer pourquoi ?

0 votes

126voto

rook Points 1251

Le site egrep est un raccourci pour grep binaire, mais à une exception près, lorsque grep est invoqué comme egrep le site grep binaire active sa logique interne comme on l'appelle grep -E .

La différence est que -E permet l'utilisation de motifs regexp étendus. Elle vous permettra d'utiliser des méta-symboles tels que + , ? ou | . Il ne s'agit pas de caractères ordinaux comme ceux que nous avions l'habitude d'utiliser dans les mots ou les noms de fichiers mais de commandes de contrôle pour grep binaire lui-même. Ainsi, | signifie OU logique.

Ainsi, par exemple, vous voulez lister les fichiers dans un répertoire et ne voir que ceux qui contiennent les extensions "mp4" ou "avi". Avec egrep vous ferez :

ls | egrep "mp4|avi"

Dans cet exemple | agit comme une commande OR, elle va saisir la sortie de ls tous les noms qui contiennent les chaînes "mp4" ou "avi". Si vous l'exécutez avec un simple grep vous n'obtiendrez rien, car grep Je ne sais pas ce que c'est | et elle recherchera la chaîne de texte entière "mp4|avi" (avec le mot "mp4"). tuyau symbole). Par exemple, si vous avez |MPG|cool-guy.q2.stats dans votre répertoire, vous l'obtiendrez avec un fichier simple. grep en cherchant avec des tuyaux.

Donc, c'est pourquoi vous devriez vous échapper | dans votre egrep pour obtenir le même effet que dans grep . S'échapper fera écran à la signification particulière de | pour grep binaire.

3 votes

Salut rook, merci beaucoup. C'est très clair. Je l'apprécie vraiment beaucoup.

23 votes

Bonne explication. La seule chose que je voudrais ajouter est que les expressions régulières de base faire reconnaissent les méta-symboles tels que '+', '?', '|', etc., mais vous devez les échapper (préfixe '\') pour les activer (alors qu'avec les expressions régulières étendues, vous devez les échapper pour les désactiver). Ainsi, "grep -E 'a|b'" est identique à "grep 'a\|b'" (correspond à a ou b), et "grep -E 'a\|b'" est identique à "grep 'a|b'" (correspond uniquement à la chaîne 'a|b').

0 votes

Sur egrep , ? , + { | ( ) sont des symboles d'expression régulière.

15voto

ap-osd Points 66

Extrait de grep expliqué et man pages.

grep fournit des options de sélection des matrices.
-E Interpréter le motif comme une expression régulière étendue (ERE)
-G Interpréter le motif comme une expression régulière de base (BRE). Il s'agit de la par défaut lorsqu'aucune option n'est spécifiée.

La variante du programme egrep est la même chose que grep -E . La variante est obsolète, mais elle est fournie à des fins de rétrocompatibilité.

Par conséquent,
grep implique grep -G
egrep implique grep -E

Il existe deux interprétations de la syntaxe des motifs regex. La différence réside dans le comportement de quelques caractères spéciaux, ? , + , () , {} et | .

  • BRE (Expression régulière de base) - ces caractères ne pas ont une signification particulière sauf si préfixé d'une barre oblique inversée \ .
  • ERE (Expression régulière étendue) - ces caractères sont spécial, sauf si préfixé d'une barre oblique inversée \ .

Depuis ^ a la même interprétation par grep (BRE) et egrep (ERE), le fonctionnement est le même dans les deux cas.
Cependant, | est l'un de ces caractères qui sont interprétés différemment selon les pays. grep (BRE) et egrep (ERE), il doit donc être échappé avec une balise \ en fonction de l'intention de la regex.

2voto

asmath Points 1

La différence entre grep et egrep est :

grep

  • Il utilise une expression régulière de base, ce qui signifie que si vous utilisez grep 'a|b' il n'utilisera pas ce "|" comme opérateur OR sans utiliser ce préfixe "".
  • Il recherche le PATTERN dans chaque FILE.

egrep

  • Il utilise l'expression régulière étendue et dans ce cas, vous pouvez utiliser des commandes comme celle-ci egrep 'a|b'
  • Il traite les méta-caractères comme tels et ne les substitue pas comme des chaînes de caractères comme grep.

1voto

vinay manyam Points 1

La commande grep est utilisée pour trouver les lignes ayant les patrons requis dans un fichier, nous avons séparé les méta-caractères en plaçant '\'.

egrep est égal à grep -E, qui est une expression régulière étendue utilisant {,},(,),|, ? comme méta-caractères sans donner '\' dans l'expression.

fgrep est utilisé pour trouver la chaîne fixe ,ce qui est égal à grep -F

test.txt
fichier
tuile
(f|t)ile
( \f\ | \t )ile

grep "(f|t)ile" test.txt
(f|t)ile

grep "( \f\ | \t )ile" test.txt
fichier
tuile

egrep "(f|t)ile" test.txt
fichier
tuile

egrep "( \f\ | \t )ile" test.txt
(f|t)ile

fgrep "(f|t)ile" test.txt
(f|t)ile

fgrep "( \f\ | \t )ile" test.txt
( \f\ | \t )ile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X