web-dev-qa-db-fra.com

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

J'aimerais passer en revue les différences entre grep, pgrep, egrep et fgrep et leur utilisation.

55
Eric Leschinski

Différences entre grep, pgrep, egrep et fgrep (Linux):

grep

grep est un acronyme qui signifie "impression d'expressions régulières globales". grep est un programme qui analyse un fichier spécifié ou des fichiers ligne par ligne, en renvoyant des lignes contenant un motif. Un modèle est une expression qui spécifie un ensemble de chaînes en interprétant les caractères comme des méta-caractères. Par exemple, le méta-caractère astérisque (*) est interprété comme signifiant "zéro ou plus de l'élément précédent". Cela permet aux utilisateurs de taper une courte série de caractères et méta-caractères dans une commande grep pour que l'ordinateur nous indique les lignes dans lesquelles les fichiers correspondent.

La commande grep standard ressemble à ceci:

grep <flags> '<regular expression>' <filename>

grep affiche les résultats de la recherche à l'écran (stdout) et renvoie les valeurs de sortie suivantes:

0    A match was found.
1    No match was found.
>1   A syntax error was found or a file was inaccessible 
     (even if matches were found).

-c pour comptabiliser le nombre de correspondances réussies et ne pas imprimer les correspondances réelles, -i pour rendre la recherche insensible à la casse, -n pour imprimer le numéro de ligne avant chaque impression de correspondance, -v pour prendre le complément de l'expression régulière (c'est-à-dire renvoient les lignes qui ne correspondent pas) et -l pour imprimer les noms de fichiers avec des lignes correspondant à l'expression.

egrep

egrep est un acronyme pour "Extended Global Regular Expressions Print".

Le "E" dans egrep signifie traiter le motif comme une expression régulière. "ERE" abrégé "Extended Regular Expressions" est activé dans egrep. egrep (identique à grep -E) traite +, ?, |, ( et ) en tant que méta-caractères.

Dans les expressions régulières (avec grep), les méta-caractères ?, +, {, |, ( et ) perdent leur signification particulière. Si vous voulez que grep traite ces caractères comme des méta-caractères, échappez-les \?, \+, \{, \|, \( et \).

Par exemple, ici, grep utilise des expressions rationnelles de base dans lesquelles le plus est traité littéralement, toutes les lignes contenant un plus sont renvoyées.

grep "+" myfile.txt

par ailleurs, egrep considère le "+" comme un méta-caractère et renvoie chaque ligne car le plus est interprété comme "une ou plusieurs fois".

egrep "+" myfile.txt

Ici, chaque ligne est renvoyée car le + a été traité par egrep comme un méta-caractère. normal, grep aurait recherché uniquement les lignes avec un + littéral.

fgrep

fgrep est un acronyme qui signifie "impression d'expressions régulières globales à chaînes fixes".

fgrep (identique à grep -F) est fixe ou rapide grep et se comporte comme grep mais ne reconnaît PAS les méta-caractères d'expression régulière comme étant spéciaux. La recherche s’achèvera plus rapidement car elle ne traite qu’une simple chaîne plutôt qu’un motif complexe.

Par exemple, si je voulais rechercher dans mon fichier .bash_profile un point littéral (.), Alors utiliser grep serait difficile, car je devrais échapper au point, car dot est un méta-caractère qui signifie "joker, tout caractère unique":

grep "." myfile.txt

La commande ci-dessus renvoie chaque ligne de myfile.txt. Faites ceci à la place:

fgrep "." myfile.txt

Alors seulement les lignes qui ont un littéral '.' en eux sont retournés. fgrep ne nous aide pas à échapper à nos méta-personnages.

pgrep

pgrep est un acronyme qui signifie "Process-ID Global Expressions Print".

pgrep examine les processus en cours et répertorie les ID de processus qui correspondent aux critères de sélection de stdout. pgrep est pratique lorsque tout ce que vous voulez savoir est l'identifiant de processus entier d'un processus. Par exemple, si je voulais connaître uniquement l'ID de processus de mon processus mysql, j'utiliserais la commande pgrep mysql qui renverrait un ID de processus comme 7312.

84
Eric Leschinski