grep, développé à l'origine pour les systèmes Unix, est l'un des utilitaires de ligne de commande les plus utilisés dans les boîtes Linux
Son nom provient d'une autre commande similaire de l'outil ed, à savoir g/re/p, qui signifie rechercher globalementune expression régulièreet imprimer leslignes correspondantes. grep recherche essentiellement un motif donné ou une expression régulière dans l'entrée ou le fichier standard et imprime les lignes qui correspondent aux critères donnés. Il est souvent utilisé pour filtrer les détails inutiles tout en imprimant uniquement les informations requises dans de gros fichiers journaux
La puissance de l'expression régulière combinée aux options supportées par grep rend cela possible
Nous allons couvrir ici quelques-unes des commandes grep les plus couramment utilisées dans différents scénarios par les administrateurs système ou les développeurs
Commençons donc... 👨💻
syntaxe de la commande grep
la commande grep attend un motif et des arguments facultatifs, ainsi qu'une liste de fichiers si elle est utilisée sans piping
grep <x><x>[options]</x></x> motif [fichiers]
Un exemple simple est le suivant : $ grep my file.txt
$ grep mon fichier.txt
mon_fichier
$
Recherche dans plusieurs fichiers
grep vous permet de rechercher un motif donné non seulement dans un, mais aussi dans plusieurs fichiers. Voici comment vous pouvez rechercher un motif dans plusieurs fichiers en utilisant le caractère générique *
$ sudo grep -i err /var/log/messages*
Résultat
$ sudo grep err /var/log/messages*
/var/log/messages:Dec 28 10:36:52 centos7vm kernel : ACPI : Using IOAPIC for interrupt routing
/var/log/messages:Dec 28 10:36:52 centos7vm kernel : ACPI : PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel : ACPI : PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel : ACPI : PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel : ACPI : PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel : ACPI : Using IOAPIC for interrupt routing
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel : ACPI : PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel : ACPI : PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel : ACPI : PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel : ACPI : PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel : BERT : Le support de la table d'enregistrement des erreurs de démarrage est désactivé. Activez-le en utilisant bert_enable comme paramètre du noyau.
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel : ACPI : PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel : ACPI : PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel : ACPI : PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel : ACPI : PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel : BERT : Le support de la table d'enregistrement des erreurs de démarrage est désactivé. Activez-le en utilisant bert_enable comme paramètre du noyau.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel : [drm:vmw_host_log <x>[vmwgfx]</x>] *ERROR* Failed to send host log message.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel : [drm:vmw_host_log <x>[vmwgfx]</x>]
*
ERROR* Échec de l'envoi du message du journal de l'hôte.
$
Vous pouvez observer dans la sortie ci-dessus que le nom du fichier est affiché en premier avant d'afficher la ligne correspondante pour indiquer où grep
a trouvé le motif donné
Recherche insensible à la casse
grep permet de rechercher un motif sans tenir compte de la casse. Utilisez l'option -i
pour indiquer à grep d'ignorer la casse
grep -i <x><x><x><x><x><x><x><x><x><x><x>[motif]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Résultat
$ grep -i it fichier_texte.txt
Il s'agit d'un exemple de fichier texte. Il contient les fonctionnalités de
. Vous pouvez toujours utiliser grep avec n'importe quel
type de données, mais il fonctionne mieux avec les données textuelles.
Il prend en charge les nombres tels que 1, 2, 3, etc. ainsi que
Ceci est un exemple de fichier texte.
Il est
répété deux fois.
$
Recherche de mots entiers
Il n'est pas toujours nécessaire d'obtenir une correspondance partielle, mais plutôt d'attendre de grep qu'il trouve un mot complet. Vous pouvez le faire avec l'option -w
grep -w <x><x><x><x><x><x><x><x><x><x><x>[motif]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Résultat
$ grep -w is fichier_texte.txt
Ceci est un exemple de fichier texte. Il contient
Ceci est un exemple de fichier texte.
Il est
répété deux fois.
$
Vérifier le nombre de correspondances
Parfois, au lieu d'obtenir la ligne correspondante, nous avons besoin du nombre de correspondances réussies faites par grep. Nous pouvons obtenir ce nombre en utilisant l'option -c
grep -c <x><x><x><x><x><x><x><x><x><x><x>[motif]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Résultat
$ grep -c is text_file.txt
2
$
Recherche dans les sous-répertoires
Il est souvent nécessaire de rechercher des fichiers non seulement dans le répertoire de travail actuel, mais aussi dans les sous-répertoires. grep vous permet de le faire facilement avec l'option -r
grep -r <x><x><x><x><x><x><x><x><x><x><x>[motif]</x></x></x></x></x></x></x></x></x></x></x> *
Résultat
$ grep -r Hello *
dir1/file1.txt:Hello One
dir1/file2.txt:Hello Two
dir1/file3.txt:Hello Three
$
Comme vous pouvez le constater, grep parcourt chaque sous-répertoire à l'intérieur du répertoire courant et répertorie les fichiers et les lignes pour lesquels une correspondance a été trouvée
Recherche inverse
Si vous souhaitez trouver quelque chose qui ne correspond pas à un motif donné, grep vous permet de le faire à l'aide de l'option -v
grep -v <x><x><x><x><x><x><x><x><x><x><x>[motif]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Résultat
$ grep This text_file.txt
Ceci est un exemple de fichier texte. Il contient
Ceci est un exemple de fichier texte. Il est répété deux fois.
$ grep -v This text_file.txt
plusieurs lignes à utiliser dans le cadre du test de la fonctionnalité de grep
. Vous pouvez toujours utiliser grep avec
n'importe quel type de données, mais il fonctionne mieux avec les données textuelles.
Il prend en charge les nombres tels que 1, 2, 3, etc. ainsi que
les alphabets et les caractères spéciaux tels que - * #, etc.
$
Vous pouvez comparer la sortie de la commande grep
sur le même motif et le même fichier avec et sans le drapeau -v
. Avec -v
, les lignes qui ne correspondent pas au motif sont imprimées
Imprimer les numéros de ligne
grep vous permet d'imprimer les numéros de ligne avec les lignes imprimées, ce qui permet de savoir facilement où se trouve la ligne dans le fichier. Utilisez l'option -n
comme indiqué pour obtenir les numéros de ligne dans la sortie
grep -n <x><x><x><x><x><x><x><x><x><x><x>[motif]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Résultat
$ grep -n This text_file.txt
1:Ceci est un exemple de fichier texte. Il contient
7:Ceci est un exemple de fichier texte.
Il est
répété deux fois.
$
Limiter la sortie de grep
Pour les gros fichiers comme les logs, etc., la sortie de grep peut être longue et vous pouvez avoir besoin d'un nombre fixe de lignes dans la sortie au lieu de tout comparer. Nous pouvons utiliser -m<x><x><x><x>[num]</x></x></x></x>
pour limiter le nombre de lignes imprimées par num. Voici comment l'utiliser
grep -m<x><x><x><x>[num]</x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x>[motif]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Remarquez comment l'utilisation de l'option -m
affecte la sortie de grep pour le même ensemble de conditions dans l'exemple ci-dessous
$ grep It fichier_texte.txt
Il s'agit d'un exemple de fichier texte. Il contient
Il prend en charge les nombres tels que 1, 2, 3, etc. ainsi que
Il s'agit d'un exemple de fichier texte. Il est répété deux fois.
$ grep -m2 It text_file.txt
Ceci est un exemple de fichier texte.
Il
contient
Il contient des nombres comme 1, 2, 3 etc. ainsi que
$
Afficher des lignes supplémentaires
Souvent, nous n'avons pas seulement besoin de lignes qui ont un motif correspondant, mais aussi de quelques lignes au-dessus ou au-dessous pour un meilleur contexte
Il est possible d'afficher une ligne au-dessus ou au-dessous (ou les deux) d'une ligne contenant un motif à l'aide de grep en utilisant les drapeaux -A
, -B
ou -C
avec la valeur num
. Ici, num
indique le nombre de lignes supplémentaires à imprimer juste au-dessus ou au-dessous de la ligne correspondant au motif. Cela s'applique à toutes les correspondances que grep trouve dans le fichier ou la liste de fichiers spécifiés
grep -A<x><x><x><x>[num]</x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x>[motif]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
OU
$
grep -B<x><x><x><x>[num]</x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x>[motif]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
OU
grep
-C<x><x><x><x>[</x></x></x></x>
num] [
<x><x><x><x><x><x><x><x><x><x><x>motif]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier] $ grep -C[num] [motif] [fichier] $ grep -C[num] [motif] [fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
La sortie ci-dessous montre une sortie normale de grep ainsi qu'une sortie avec les drapeaux -A
, -B
et -C
, l'un après l'autre. Remarquez comment grep interprète les drapeaux et leurs valeurs et les changements dans les sorties respectives. Avec l'indicateur -A1
, grep imprime une ligne qui suit immédiatement la ligne correspondante
De même, avec l'indicateur -B1
, il imprime une ligne juste avant la ligne correspondante. Avec l'option -C1
, il affiche une ligne avant et après la ligne correspondante
$ grep numbers text_file.txt
Il prend en charge les nombres tels que 1, 2, 3 etc. ainsi que
$ grep -A1 numbers text_file.txt
Il prend en charge les nombres tels que 1, 2, 3 etc. ainsi que
les alphabets et les caractères spéciaux tels que - * # etc.
$ grep -B1 numbers text_file.txt
type de données mais il fonctionne mieux avec les données textuelles.
Il supporte les nombres comme 1, 2, 3 etc. ainsi que
$
grep -C1 numbers text_file.txt
type de données mais il fonctionne mieux avec les données textuelles.
Il supporte les nombres comme 1, 2, 3 etc. ainsi que
les alphabets et les caractères spéciaux comme - * # etc.
$
Liste des noms de fichiers
Pour afficher uniquement le nom des fichiers dans lesquels un motif a été trouvé au lieu des lignes correspondantes, utilisez l'option -l
grep -l <x><x><x><x><x><x><x><x><x><x><x>[motif]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Voici un exemple d'exécution
$ grep -l su *.txt
file.txt
text_file.txt
$
Imprimer les lignes exactes
Parfois, nous avons besoin d'imprimer les lignes qui correspondent exactement à un motif donné, et non à une partie de celui-ci. grep permet d'utiliser l'option -x
pour faire cela
grep -x <x><x><x><x><x><x><x><x><x><x><x>[motif]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Dans l'exemple ci-dessous, le fichier.txt contient une ligne avec un seul mot "support" et, en tant que tel, il est traité par grep avec l'option -x
tout en ignorant les lignes qui peuvent contenir les mots "support" avec d'autres textes
grep -x support *.txt
file.txt:support
$
Correspondance avec la chaîne de départ
En utilisant des expressions régulières, nous pouvons trouver une chaîne de caractères au début d'une ligne. Voici comment procéder
grep <x><x>[options]</x></x> "^<x>[chaîne de caractères]</x>" <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Exemple
$ grep It fichier_texte.txt
Il s'agit d'un exemple de fichier texte. Il contient
Il prend en charge les nombres tels que 1, 2, 3, etc. ainsi que
Ceci est un exemple de fichier texte.
Il est
répété deux fois.
$
grep ^It text_file.txt
Il contient des nombres comme 1, 2, 3, etc. ainsi que
$
Observez comment l'utilisation du caractère ^
modifie la sortie. ^
indique le début de la chaîne et grep a trouvé ^It
comme toute ligne commençant par le mot It
. L'utilisation de guillemets peut s'avérer utile lorsque le motif contient des espaces, etc
Correspondance avec la chaîne de fin
Une autre expression régulière souvent utile consiste à faire correspondre le motif de fin de ligne
grep <x><x>[options]</x></x> "<x>[chaîne]</x>$" <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Exemple
$ grep "\." fichier_texte.txt
Il s'agit d'un exemple de fichier texte. Il contient les fonctionnalités de
. Vous pouvez toujours utiliser grep avec n'importe quel
type de données, mais il fonctionne mieux avec les données textuelles.
Il prend en charge les nombres tels que 1, 2, 3, etc. ainsi que
les alphabets et les caractères spéciaux tels que - * #, etc.
Il s'agit d'un exemple de fichier texte. Il est répété deux fois.
$ grep "\N$" text_file.txt
type de données mais il fonctionne mieux avec les données textuelles.
alphabets et caractères spéciaux comme - * # etc.
Ceci est un exemple de fichier texte.
Il est
répété deux fois.
$
Nous avons essayé de faire correspondre le caractère .
à la fin de la ligne. Puisque le point (.) est un caractère spécial, nous devons l'échapper avec le caractère \
. Remarquez à nouveau que la sortie varie lorsque nous nous contentons de faire correspondre le caractère .
et lorsque nous utilisons $
pour demander à grep de ne faire correspondre que les lignes qui se terminent par .
(et non celles qui peuvent contenir le caractère n'importe où entre les deux)
Utiliser un fichier de motifs
Il peut arriver que vous ayez une liste complexe de motifs que vous utilisez souvent. Au lieu de l'écrire à chaque fois, vous pouvez spécifier une liste de motifs dans un fichier et l'utiliser avec l'option -f.
Le fichier doit contenir un motif par ligne
grep -f [fichier_motif] [fichier_à_correspondre]
Dans notre exemple, nous avons créé un fichier de motifs nommé pattern .txt
avec le contenu ci-dessous
$ cat pattern.txt
Ceci
Cela
$
Pour l'utiliser, utilisez l'option -f
grep -f pattern.txt text_file.txt
Il s'agit d'un exemple de fichier texte. Il contient
Il prend en charge les nombres tels que 1, 2, 3, etc. ainsi que
Ceci est un exemple de fichier texte.
Il est
répété deux fois.
$
Spécifier plusieurs motifs
grep permet de spécifier plusieurs motifs à l'aide de l'option -e
grep -e [motif1] -e [motif2] -e [motif3]...<x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Exemple
$ grep -e is -e It -e to text_file.txt
Il s'agit d'un exemple de fichier texte. Il contient
plusieurs lignes à utiliser dans le cadre du test de grep
Il prend en charge les nombres tels que 1, 2, 3, etc. ainsi que
Voici un exemple de fichier texte.
Il est
répété deux fois.
$
Spécifiez un RegEx étendu
grep prend également en charge les expressions régulières étendues (ERE) en utilisant le drapeau -E
. Cette fonction est similaire à la commande egrep
sous Linux
L'utilisation de l'ERE présente un avantage lorsque vous souhaitez traiter les métacaractères tels quels et ne pas les remplacer par des chaînes de caractères comme le fait grep. Cela vous donne plus de flexibilité en termes d'échappement comme nous sommes obligés de le faire dans le cas de grep. Ceci étant dit, l'utilisation de -E
avec grep est équivalente à la commande egrep
$ grep -E '[Extended RegEx]'<x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichier]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>
Voici une utilisation d'ERE où nous voulons imprimer les lignes qui ne sont pas commentées ou vides. C'est particulièrement utile pour trouver quelque chose dans de gros fichiers de configuration. J'ai également utilisé le drapeau -v
pour NE PAS afficher les lignes correspondant au motif '^(#|$)'
$ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Sous-système sftp /usr/libexec/openssh/sftp-server
$
Conclusion
Les exemples ci-dessus ne sont que la partie émergée de l'iceberg. grep prend en charge toute une série d'options et peut être un outil très utile dans les mains d'une personne qui sait comment l'utiliser efficacement. Nous pouvons non seulement utiliser les exemples donnés ci-dessus, mais aussi les combiner de différentes manières pour obtenir ce dont nous avons besoin
Reportez-vous à sa page de manuel pour en savoir plus
$ man grep
Ensuite, découvrez des exemples de commandes SFTP.