J'aimerais qu'on m'explique les différences entre grep
, pgrep
, egrep
et fgrep
et comment je les utiliserais.
Réponse
Trop de publicités?Différences entre grep, pgrep, egrep et fgrep (Linux) :
grep
grep est un acronyme qui signifie "Global Regular Expressions Print" (impression d'expressions régulières globales). grep est un programme qui parcourt un ou plusieurs fichiers spécifiés ligne par ligne, en renvoyant les lignes qui contiennent un motif. Un motif est une expression qui spécifie un ensemble de chaînes de caractères en interprétant les caractères comme des métacaractères. Par exemple, le métacaractè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 de métacaractères dans une commande grep pour que l'ordinateur nous montre quelles lignes de quels fichiers correspondent.
La commande standard grep ressemble à :
grep <flags> '<regular expression>' <filename>
grep imprime 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).
Certains drapeaux communs sont : -c
pour compter le nombre de correspondances réussies et ne pas imprimer les correspondances réelles, -i
pour que la recherche ne tienne pas compte de 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 retourner les lignes qui ne correspondent pas), et -l
pour imprimer les noms de fichier des fichiers dont les lignes correspondent à l'expression.
egrep
egrep est un acronyme qui signifie "Extended Global Regular Expressions Print".
Le 'E' de egrep signifie que le motif est traité comme une expression régulière. Les "Expressions Régulières Étendues" abrégées 'ERE' sont activées dans egrep. egrep (qui est identique à grep -E
) régalez-vous +
, ?
, |
, (
et )
comme méta-caractères.
Dans les expressions régulières de base (avec grep), les métacaractères ?
, +
, {
, |
, (
et )
perdent leur signification particulière. Si vous souhaitez que grep traite ces caractères comme des méta-caractères, échappez-les \?
, \+
, \{
, \|
, \(
et \)
.
Par exemple, ici grep utilise des expressions régulières de base où le plus est traité littéralement, toute ligne contenant un plus est retournée.
grep "+" myfile.txt
egrep, quant à lui, traite le "+" comme un méta-caractère et renvoie chaque ligne car plus est interprété comme "une ou plusieurs fois".
egrep "+" myfile.txt
Ici, chaque ligne est renvoyée parce que le +
a été traité par egrep comme un méta-caractère. Un grep normal n'aurait recherché que les lignes contenant un caractère littéral +
.
fgrep
fgrep est un acronyme qui signifie "Fixed-string Global Regular Expressions Print".
fgrep (qui est identique à grep -F) est un grep fixe ou rapide 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 sera plus rapide car elle ne traite qu'une simple chaîne de caractères plutôt qu'un motif complexe.
Par exemple, si je voulais rechercher un point littéral (.) dans mon fichier .bash_profile, l'utilisation de grep serait difficile car je devrais échapper le point. En effet, le point est un métacaractère qui signifie "caractère de remplacement, n'importe quel caractère" :
grep "." myfile.txt
La commande ci-dessus renvoie toutes les lignes de monfichier.txt. Faites ceci à la place :
fgrep "." myfile.txt
Ensuite, seules les lignes qui ont un '.' littéral sont retournées. fgrep nous aide à ne pas prendre la peine d'échapper nos méta-caractères.
pgrep
pgrep est un acronyme qui signifie "Process-ID Global Regular Expressions Print".
pgrep examine les processus en cours d'exécution et liste les identifiants de processus qui correspondent aux critères de sélection sur stdout. pgrep est pratique lorsque tout ce que vous voulez savoir est l'entier de l'identifiant d'un processus. Par exemple, si je voulais connaître uniquement l'ID du processus mysql, j'utiliserais la commande suivante pgrep mysql
qui renverrait un identifiant de processus comme 7312.