GNU/Linux >> Tutoriels Linux >  >> Linux

Commande Grep sous Linux (Rechercher du texte dans des fichiers)

Le grep La commande signifie "impression d'expression régulière globale", et c'est l'une des commandes les plus puissantes et les plus couramment utilisées sous Linux.

grep recherche dans un ou plusieurs fichiers d'entrée les lignes qui correspondent à un modèle donné et écrit chaque ligne correspondante sur la sortie standard. Si aucun fichier n'est spécifié, grep lit à partir de l'entrée standard, qui est généralement la sortie d'une autre commande.

Dans cet article, nous allons vous montrer comment utiliser le grep commande à travers des exemples pratiques et des explications détaillées des grep GNU les plus courants options.

grep Syntaxe de commande #

La syntaxe du grep commande est la suivante :

grep [OPTIONS] PATTERN [FILE...]

Les éléments entre crochets sont facultatifs.

  • OPTIONS - Zéro ou plusieurs options. Grep inclut un certain nombre d'options qui contrôlent son comportement.
  • PATTERN - Modèle de recherche.
  • FILE - Zéro ou plusieurs noms de fichiers d'entrée.

Pour pouvoir rechercher le fichier, l'utilisateur exécutant la commande doit avoir un accès en lecture au fichier.

Rechercher une chaîne dans les fichiers #

L'utilisation la plus élémentaire de grep commande est de rechercher une chaîne (texte) dans un fichier.

Par exemple, pour afficher toutes les lignes contenant la chaîne bash depuis le /etc/passwd fichier, vous exécuterez la commande suivante :

grep bash /etc/passwd

Le résultat devrait ressembler à ceci :

root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Si la chaîne contient des espaces, vous devez la placer entre guillemets simples ou doubles :

grep "Gnome Display Manager" /etc/passwd

Inverser la correspondance (exclure) #

Pour afficher les lignes qui ne correspondent pas à un motif, utilisez le -v ( ou --invert-match ).

Par exemple, pour imprimer les lignes qui ne contiennent pas la chaîne nologin vous utiliseriez :

grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
colord:x:124:124::/var/lib/colord:/bin/false
git:x:994:994:git daemon user:/:/usr/bin/git-shell
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Utilisation de Grep pour filtrer la sortie d'une commande #

La sortie d'une commande peut être filtrée avec grep à travers la tuyauterie, et seules les lignes correspondant à un motif donné seront imprimées sur le terminal.

Par exemple, pour savoir quels processus sont en cours d'exécution sur votre système en tant qu'utilisateur www-data vous pouvez utiliser le ps suivant commande :

ps -ef | grep www-data
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
root     18272 17714  0 16:00 pts/0    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

Vous pouvez également enchaîner plusieurs tuyaux sur commande. Comme vous pouvez le voir dans la sortie ci-dessus, il y a aussi une ligne contenant le grep processus. Si vous ne voulez pas que cette ligne soit affichée, passez la sortie à un autre grep exemple comme indiqué ci-dessous.

ps -ef | grep www-data | grep -v grep
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

Pour rechercher récursivement un modèle, invoquez grep avec le -r option (ou --recursive ). Lorsque cette option est utilisée grep recherchera dans tous les fichiers du répertoire spécifié, en ignorant les liens symboliques rencontrés de manière récursive.

Pour suivre tous les liens symboliques, au lieu de -r , utilisez le -R option (ou --dereference-recursive ).

Voici un exemple montrant comment rechercher la chaîne linuxize.com dans tous les fichiers à l'intérieur du /etc répertoire :

grep -r linuxize.com /etc

La sortie inclura les lignes correspondantes précédées du chemin d'accès complet au fichier :

/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com:    server_name linuxize.com   www.linuxize.com;

Si vous utilisez le -R option, grep suivra tous les liens symboliques :

grep -R linuxize.com /etc

Notez la dernière ligne de la sortie ci-dessous. Cette ligne n'est pas imprimée lorsque grep est invoqué avec -r parce que les fichiers à l'intérieur des sites-enabled de Nginx répertoire sont des liens symboliques vers les fichiers de configuration à l'intérieur du sites-available répertoire.

/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com:    server_name linuxize.com   www.linuxize.com;
/etc/nginx/sites-enabled/linuxize.com:    server_name linuxize.com   www.linuxize.com;

Afficher uniquement le nom de fichier #

Pour supprimer le grep par défaut afficher et imprimer uniquement les noms des fichiers contenant le motif correspondant, utilisez le -l ( ou --files-with-matches ).

La commande ci-dessous recherche dans tous les fichiers se terminant par .conf dans le répertoire de travail courant et imprime uniquement les noms des fichiers contenant la chaîne linuxize.com :

grep -l linuxize.com *.conf

La sortie ressemblera à ceci :

tmux.conf
haproxy.conf

Le -l L'option est généralement utilisée en combinaison avec l'option récursive -R :

grep -Rl linuxize.com /tmp

Par défaut, grep est sensible à la casse. Cela signifie que les caractères majuscules et minuscules sont traités comme distincts.

Pour ignorer la casse lors de la recherche, appelez grep avec le -i option (ou --ignore-case ).

Par exemple, lors de la recherche de Zebra sans aucune option, la commande suivante n'affichera aucune sortie, c'est-à-dire qu'il y a des lignes correspondantes :

grep Zebra /usr/share/words

Mais si vous effectuez une recherche insensible à la casse en utilisant le -i option, il correspondra à la fois aux lettres majuscules et minuscules :

grep -i Zebra /usr/share/words

Spécifier "Zebra" correspondra à "zebra", "ZEbrA" ou toute autre combinaison de lettres majuscules et minuscules pour cette chaîne.

zebra
zebra's
zebras

Rechercher des mots complets #

Lors de la recherche d'une chaîne, grep affichera toutes les lignes où la chaîne est incorporée dans des chaînes plus grandes.

Par exemple, si vous recherchez "gnu", toutes les lignes où "gnu" est incorporé dans des mots plus longs, tels que "cygnus" ou "magnum" seront recherchées :

grep gnu /usr/share/words
cygnus
gnu
interregnum
lgnu9d
lignum
magnum
magnuson
sphagnum
wingnut

Pour renvoyer uniquement les lignes où la chaîne spécifiée est un mot entier (entouré de caractères non verbaux), utilisez le -w ( ou --word-regexp ).

Les caractères des mots incluent des caractères alphanumériques (a-z , A-Z , et 0-9 ) et des traits de soulignement (_ ). Tous les autres caractères sont considérés comme des caractères non verbaux.

Si vous exécutez la même commande que ci-dessus, y compris le -w option, le grep La commande renverra uniquement les lignes où gnu est inclus en tant que mot séparé.

grep -w gnu /usr/share/words
gnu

Afficher les numéros de ligne #

Le -n ( ou --line-number ) l'option indique grep pour afficher le numéro de ligne des lignes contenant une chaîne qui correspond à un modèle. Lorsque cette option est utilisée, grep imprime les correspondances sur la sortie standard préfixée par le numéro de ligne.

Par exemple pour afficher les lignes du /etc/services fichier contenant la chaîne bash précédé du numéro de ligne correspondant, vous pouvez utiliser la commande suivante :

grep -n 10000 /etc/services

La sortie ci-dessous nous montre que les correspondances se trouvent sur les lignes 10423 et 10424.

10423:ndmp            10000/tcp
10424:ndmp            10000/udp

Compter les correspondances #

Pour imprimer un nombre de lignes correspondantes sur la sortie standard, utilisez le -c ( ou --count ).

Dans l'exemple ci-dessous, nous comptons le nombre de comptes qui ont /usr/bin/zsh comme une coque.

regular expressiongrep -c '/usr/bin/zsh' /etc/passwd
4

Mode silencieux #

Le -q (ou --quiet ) indique grep pour fonctionner en mode silencieux pour ne rien afficher sur la sortie standard. Si une correspondance est trouvée, la commande se termine avec le statut 0 . Ceci est utile lors de l'utilisation de grep dans les scripts shell où vous souhaitez vérifier si un fichier contient une chaîne et effectuer une certaine action en fonction du résultat.

Voici un exemple d'utilisation de grep en mode silencieux comme commande de test dans un if déclaration :

if grep -q PATTERN filename
then
    echo pattern found
else
    echo pattern not found
fi

Expression régulière de base #

GNU Grep a trois ensembles de fonctionnalités d'expressions régulières, Basic, Extended et Perl-compatible.

Par défaut, grep interprète le modèle comme une expression régulière de base où tous les caractères, à l'exception des méta-caractères, sont en fait des expressions régulières qui se correspondent.

Vous trouverez ci-dessous une liste des méta-caractères les plus couramment utilisés :

  • Utilisez le ^ (caret) pour correspondre à l'expression au début d'une ligne. Dans l'exemple suivant, la chaîne kangaroo ne correspondra que s'il se produit au tout début d'une ligne.

    grep "^kangaroo" file.txt
  • Utilisez le $ (dollar) pour correspondre à l'expression à la fin d'une ligne. Dans l'exemple suivant, la chaîne kangaroo ne correspondra que s'il se produit à la toute fin d'une ligne.

    grep "kangaroo$" file.txt
  • Utilisez le . (point) pour correspondre à n'importe quel caractère unique. Par exemple, pour faire correspondre tout ce qui commence par kan comporte alors deux caractères et se termine par la chaîne roo , vous pouvez utiliser le modèle suivant :

    grep "kan..roo" file.txt
  • Utilisez [ ] (crochets) pour correspondre à n'importe quel caractère unique entre crochets. Par exemple, trouvez les lignes qui contiennent accept ou "accent , vous pouvez utiliser le modèle suivant :

    grep "acce[np]t" file.txt
  • Utilisez [^ ] pour correspondre à n'importe quel caractère unique qui n'est pas entre crochets. Le modèle suivant correspondra à toute combinaison de chaînes contenant co(any_letter_except_l)a , comme coca , cobalt et ainsi de suite, mais ne correspondra pas aux lignes contenant cola ,

    grep "co[^l]a" file.txt

Pour échapper à la signification spéciale du caractère suivant, utilisez le \ (barre oblique inverse).

Expressions régulières étendues #

Pour interpréter le modèle comme une expression régulière étendue, utilisez le -E ( ou --extended-regexp ) option. Les expressions régulières étendues incluent tous les méta-caractères de base, ainsi que des méta-caractères supplémentaires pour créer des modèles de recherche plus complexes et plus puissants. Voici quelques exemples :

  • Faites correspondre et extrayez toutes les adresses e-mail d'un fichier donné :

    grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
  • Faites correspondre et extrayez toutes les adresses IP valides d'un fichier donné :

    grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt

Le -o L'option est utilisée pour imprimer uniquement la chaîne correspondante.

Rechercher plusieurs chaînes (modèles) #

Deux modèles de recherche ou plus peuvent être joints à l'aide de l'opérateur OU | .

Par défaut, grep interprète le modèle comme une expression régulière de base où les méta-caractères tels que | perdent leur signification particulière et leurs versions avec barre oblique inversée doivent être utilisées.

Dans l'exemple ci-dessous, nous recherchons toutes les occurrences des mots fatal , error , et critical dans le fichier Nginx logerror :

grep 'fatal\|error\|critical' /var/log/nginx/error.log

Si vous utilisez l'option d'expression régulière étendue -E , puis l'opérateur | ne doit pas être échappé, comme indiqué ci-dessous :

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Pour imprimer un nombre spécifique de lignes avant de faire correspondre les lignes, utilisez le -B ( ou --before-context ).

Par exemple, pour afficher cinq lignes de contexte avant les lignes correspondantes, vous utiliserez la commande suivante :

grep -B 5 root /etc/passwd

Pour imprimer un nombre spécifique de lignes après les lignes correspondantes, utilisez le -A ( ou --after-context ).

Par exemple, pour afficher cinq lignes de contexte de fin après les lignes correspondantes, vous utiliserez la commande suivante :

grep -A 5 root /etc/passwd

Conclusion #

Le grep La commande vous permet de rechercher un modèle à l'intérieur des fichiers. Si une correspondance est trouvée, grep imprime les lignes contenant le motif spécifié.

Il y a beaucoup plus à apprendre sur Grep sur la page du manuel de l'utilisateur de Grep.

Si vous avez des questions ou des commentaires, n'hésitez pas à laisser un commentaire.


Linux
  1. 5 outils de ligne de commande pour trouver rapidement des fichiers sous Linux

  2. 25 exemples pratiques de commande de recherche utiles sous Linux

  3. Comment utiliser la commande Grep pour rechercher du texte dans des fichiers

  4. Comment rechercher des fichiers avec la commande fd sous Linux

  5. Comment puis-je trouver tous les fichiers contenant du texte spécifique sous Linux ?

Comment rechercher des fichiers avec la commande fd sous Linux

Rechercher du texte dans des fichiers sous Linux à l'aide de grep

Tutoriel sur la commande de recherche Linux (avec exemples)

Comment trouver des dossiers sous Linux

Commande Grep sous Linux/UNIX

Commande ls sous Linux/UNIX