Android

Commande Grep sous Linux (recherche de texte dans des fichiers)

14-commandes de recherche sous linux grep,find #darija

14-commandes de recherche sous linux grep,find #darija

Table des matières:

Anonim

La commande grep qui signifie «impression d'expression régulière globale» 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 des lignes qui correspondent à un modèle donné et écrit chaque ligne correspondante dans 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 ce tutoriel, nous allons vous montrer comment utiliser la commande grep travers des exemples pratiques et des explications détaillées des options grep les plus courantes.

Syntaxe de la commande Grep

Avant d'entrer dans la façon d'utiliser la commande grep , commençons par revoir la syntaxe de base.

Les expressions de l'utilitaire grep prennent la forme suivante:

grep PATTERN

Les éléments entre crochets sont facultatifs.

  • OPTIONS - Zéro ou plusieurs options. Grep fournit un certain nombre d'options qui contrôlent son comportement. PATTERN - Motif de recherche. FILE - Zéro ou plusieurs noms de fichier d'entrée.

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

Comment utiliser grep pour rechercher une chaîne dans des fichiers

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

Par exemple, pour afficher les lignes du fichier /etc/passwd contenant la chaîne bash vous pouvez utiliser la commande suivante:

grep bash /etc/passwd

La sortie devrait ressembler à ceci:

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

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

grep "Gnome Display Manager" /etc/passwd

Inverser la correspondance (exclure)

Pour afficher les lignes qui ne correspondent pas à un modèle, utilisez l'option -v (ou --invert-match ).

Par exemple, pour afficher les lignes du fichier /etc/passwd qui ne contiennent pas la chaîne de nologin vous pouvez utiliser la commande suivante:

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

Comment utiliser Grep pour rechercher une chaîne dans la sortie de commande

Au lieu de spécifier des fichiers d'entrée, vous pouvez diriger la sortie d'une autre commande vers grep , puis afficher uniquement les lignes correspondant à un modèle donné.

Par exemple, pour savoir quels processus s'exécutent sur votre système en tant qu'utilisateur www-data vous pouvez utiliser la commande ps suivante:

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 chaîner plusieurs tuyaux sur commande. Comme vous pouvez le voir dans la sortie ci-dessus, il y a aussi une ligne contenant le processus grep . Si vous ne voulez pas que cette ligne soit affichée, passez la sortie à une autre instance grep 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 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

Recherche récursive

Pour rechercher récursivement un modèle, utilisez l'option -r (ou --recursive ). Cela va rechercher dans tous les fichiers du répertoire spécifié, en sautant les liens symboliques qui sont rencontrés récursivement. Pour suivre tous les liens symboliques, utilisez l'option -R (ou --dereference-recursive ).

Dans l'exemple suivant, nous recherchons la chaîne linuxize.com dans tous les fichiers du répertoire /etc :

grep -r linuxize.com /etc

La commande imprimera les lignes correspondantes préfixées par le 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 à la place -r vous utilisez l'option -R , grep suivra tous les liens symboliques:

grep -R linuxize.com /etc

Remarquez la dernière ligne de la sortie. Cette ligne n'est pas imprimée dans l'exemple ci-dessus car les fichiers à l'intérieur du répertoire sites-enabled les sites-enabled de Nginx sont des liens symboliques vers des fichiers de configuration à l'intérieur du répertoire des sites-available .

/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 la sortie grep par défaut et imprimer uniquement les noms des fichiers contenant le modèle correspondant, vous pouvez utiliser l'option -l (ou --files-with-matches ).

Par exemple, pour rechercher dans tous les fichiers se terminant par .conf dans le répertoire de travail actuel et imprimer uniquement les noms des fichiers contenant la chaîne linuxize.com :

grep -l linuxize.com *.conf

La sortie ressemblera à ceci:

tmux.conf haproxy.conf

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

grep -Rl linuxize.com /tmp

Recherche insensible à la casse

Par défaut, la commande 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, utilisez l'option -i (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 ne respectant pas la casse à l'aide de l'option -i , elle correspondra aux lettres majuscules et minuscules:

grep -i Zebra /usr/share/words

La spécification de «Zebra» correspondra à «zebra», «ZEbrA» ou à toute autre combinaison de lettres majuscules et minuscules pour cette chaîne.

zebra zebra's zebras

Rechercher des mots entiers

Lors de la recherche de «gnu», grep imprimera également les lignes où «gnu» est incorporé dans des mots plus gros, tels que «cygnus» ou «magnum».

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 --word-regexp ), utilisez l'option -w (ou --word-regexp ).

Les caractères Word comprennent des caractères alphanumériques ( az , AZ et 0-9 ) et des traits de soulignement ( _ ). Tous les autres caractères sont considérés comme des caractères non verbaux.

grep -w gnu /usr/share/words

gnu

Afficher les numéros de ligne

Pour afficher le nombre de lignes contenant une chaîne correspondant à un modèle, utilisez l'option -n (ou --line-number ). Lorsque vous utilisez cette option, grep imprimera les correspondances sur la sortie standard préfixée avec le numéro de ligne sur lequel elle a été trouvée.

Par exemple, pour afficher les lignes du fichier /etc/services contenant la chaîne bash préfixée 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

Nombre de matchs

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

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

grep -c '/usr/bin/zsh' /etc/passwd

4

Rechercher plusieurs chaînes (motifs)

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

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 rétro-obliques doivent être utilisées.

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

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

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

Mode silencieux

Le -q (ou --quiet ) indique à grep de ne rien écrire sur le terminal (sortie standard). Si une correspondance est trouvée, la commande se termine avec le statut 0 . Ceci est utile lorsque vous utilisez grep dans des 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 une instruction if :

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

Expression régulière de base

GNU Grep a deux ensembles de fonctionnalités d'expression régulière, de base et étendu. Par défaut, grep interprète le modèle comme une expression régulière de base.

Lorsqu'ils sont utilisés en mode d'expression régulière de base, tous les autres caractères, à l'exception des méta-caractères, sont en fait des expressions régulières qui se correspondent. Voici une liste des méta-caractères les plus couramment utilisés:

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

    grep "^kangaroo" file.txt

    Utilisez le symbole $ (dollar) pour faire correspondre l'expression à la fin d'une ligne. Dans l'exemple suivant, la chaîne kangaroo$ ne correspondra que si elle se produit à la toute fin d'une ligne.

    grep "kangaroo$" file.txt

    Utilisez le . (point) pour correspondre à n'importe quel caractère. Par exemple, pour faire correspondre tout ce qui commence par kan puis a deux caractères et se termine par la chaîne roo , vous pouvez utiliser le modèle suivant:

    grep "kan..roo" file.txt

    Utilisation (crochets) pour faire correspondre n'importe quel caractère unique entre crochets. Par exemple, recherchez les lignes contenant accept ou « accent , vous pouvez utiliser le modèle suivant:

    grep "accet" file.txt

    Utilisation (crochets) pour faire correspondre n'importe quel caractère unique entre crochets. Le modèle suivant correspondra à toute combinaison de chaînes contenant co(any_letter_except_l)a , comme coca , cobalt , etc., mais ne correspondra pas aux lignes contenant cola , grep "coa" file.txt

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

Expressions régulières étendues

Pour interpréter le modèle comme une expression régulière étendue, utilisez l'option -E (ou --extended-regexp ). 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 extraire toutes les adresses e-mail d'un fichier donné:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Faites correspondre et extrayez toutes les adresses IP valides d'un fichier donné:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

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

Imprimer les lignes avant une correspondance

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

Par exemple, pour afficher cinq lignes de contexte de tête avant de faire correspondre les lignes, vous utiliseriez la commande suivante:

grep -B 5 root /etc/passwd

Imprimer les lignes après une correspondance

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

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

grep -A 5 root /etc/passwd

Conclusion

La commande grep vous permet de rechercher un modèle à l'intérieur des fichiers. Si une correspondance est trouvée, grep imprimera 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.

terminal grep