Utilisation appropriée des commandes Find et Grep sous Linux

La plupart des utilisateurs novices des systèmes Unix, en particulier Linux, ne sont pas familiarisés avec les opérateurs de ligne de commande de base utilisés dans ce système d'exploitation. Examinons de plus près les fonctions et l'utilisation des opérateurs find et grep.

Utilisation des commandes Find et Grep sous Linux.

TROUVER

La commande Linux find est un utilitaire de ligne de commande permettant de parcourir la hiérarchie des fichiers. Il peut être utilisé pour rechercher des fichiers et des répertoires et effectuer des opérations ultérieures avec eux. Il prend en charge la recherche par fichier, dossier, nom, date de création, date de modification, propriétaire et autorisations. À l'aide de -exec, d'autres commandes UNIX peuvent être exécutées pour les fichiers ou les dossiers trouvés. Syntaxe:

$ find [où commencer la recherche] [expression détermine ce qu'il faut trouver] [-options] [ce qu'il faut trouver]

Options:

  • -exec - le fichier requis qui répond aux critères ci-dessus et renvoie 0 comme état de sortie pour une exécution réussie de la commande;
  • -ok - fonctionne de la même manière que -exec, sauf que l'utilisateur est d'abord invité;
  • -inum N - recherche avec le nombre "N";
  • -links N - recherche avec les liens "N";
  • -name demo - recherche les fichiers spécifiés dans “demo”;
  • -newer file - recherche les fichiers qui ont été modifiés / créés après “fichier”;
  • -perm octal - recherche si la résolution est octale;
  • -print - affiche le chemin d'accès aux documents trouvés en utilisant les autres critères;
  • -empty - recherche de documents et de répertoires vides;
  • -size + N / -N - blocs de recherche "N"; "N" et "c" peuvent être utilisés pour mesurer la taille en caractères; "+ N" signifie une plus grande taille de "N" blocs et "-N" signifie une plus petite taille de "N" blocs;
  • -nom d'utilisateur - recherche des documents appartenant au nom d'utilisateur ou à l'identifiant "nom";
  • \ (expr \) - Vrai si "expr" est vrai; Utilisé pour regrouper les critères avec OR ou AND.

Grep

La commande grep est utilisée pour rechercher des fichiers. La fonction signifie “impression globale d'expressions régulières” et constitue l'une des commandes les plus puissantes et les plus utilisées de Linux. La commande recherche un ou plusieurs fichiers d'entrée correspondant au modèle spécifié et écrit chaque ligne correspondante dans la sortie standard. Si aucun fichier n'est spécifié, la commande est lue à 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 entrer une commande, avec des exemples pratiques et des explications détaillées sur les options GNU grep les plus courantes.

Syntaxe de commande

Avant de commencer à utiliser la commande, commençons par examiner la syntaxe de base. Les expressions utilitaires ont la forme suivante:

[OPTIONS] MOTIF [FICHIER ...]

Les éléments entre crochets sont facultatifs.

  • OPTIONS - zéro choix ou plus. L'équipe fournit un certain nombre d'options qui contrôlent son comportement.
  • MOTIF - Modèle de recherche.
  • FILE - zéro ou plusieurs noms de fichier d'entrée.

Comment entrer une commande pour rechercher des fichiers

Le but principal de la commande est de rechercher du texte dans le fichier. Par exemple, pour afficher à partir du fichier / etc / passwd contenant la ligne bash, vous pouvez utiliser la commande suivante:

$ grep bash / etc / passwd

La sortie devrait ressembler à ceci:

racine 0: 0: racine: / racine: / bin / bash

domain1000: 1000: domaine: / home / domaine: / bin / bash

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

$ "Gestionnaire d'affichage Gnome" / etc / passwd

Inverser le match (ex)

Pour afficher les lignes qui ne correspondent pas au modèle, entrez le paramètre –v (ou –invert-match). Par exemple, pour afficher un fichier ne contenant pas nologin à partir du fichier / etc / passwd, vous pouvez entrer la commande suivante:

$ -v nologin / etc / passwd

Sortie:

racine 0: 0: racine: / racine: / bin / bash

colord 124: 124 :: / var / lib / colord: / bin / false

git 994: 994: utilisateur du démon git: /: / usr / bin / git-shell

linuxize 1000: 1000: linuxize: / home / linuxize: / bin / bash

Comment utiliser la commande pour rechercher dans la sortie

Au lieu de cela, si vous spécifiez des fichiers d'entrée, vous pouvez rediriger la sortie d'une autre commande, puis afficher uniquement les lignes correspondant au modèle spécifié. Par exemple, pour savoir quels processus s'exécutent sur votre système en tant qu'utilisateur de www-data, vous pouvez utiliser la commande suivante:

$ ps -ef | www-data

Sortie:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: piscine www

root 18272 17714 0 16:00 pts / 0 00:00:00 —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: processus de travail

www-data 31148 12770 0 octobre 22? 00:00:00 nginx: processus du gestionnaire de cache

Vous pouvez également combiner plusieurs canaux dans une équipe. Comme vous pouvez le voir dans le résultat ci-dessus, il existe également une ligne contenant le processus. Si vous ne souhaitez pas que cette ligne soit affichée, envoyez le résultat à une autre instance, comme indiqué ci-dessous.

$ ps -ef | www-data | grep -v grep

Sortie:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: piscine www

root 18272 17714 0 16:00 pts / 0 00:00:00 —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: processus de travail

www-data 31148 12770 0 octobre 22? 00:00:00 nginx: processus du gestionnaire de cache

Recherche récursive

Pour rechercher un motif de manière récursive, entrez l'option –r (ou –recursive). Cela vous permettra de rechercher dans tous les fichiers du répertoire spécifié, en ignorant les liens symboliques récursifs. Pour parcourir tous les liens symboliques, utilisez l'option –r (ou –dereference-récursive). Dans l'exemple suivant, nous recherchons domain.com dans tous les fichiers du répertoire / etc:

$ -r domain.com / etc

La commande imprimera les champs correspondants avec le préfixe du chemin de fichier complet.

/etc/hosts:127.0.0.1 node2.domain.com /etc/nginx/sites-available/domain.com: nom_serveur domain.com www.domain.com;

Si au lieu de –r vous utilisez l'option –R, la commande suivra tous les liens symboliques:

$ -R domain.com / etc

Notez le dernier champ de sortie. Ceci n'est pas imprimé dans l'exemple ci-dessus, car les fichiers du répertoire Nginx activé pour les sites sont des liens symboliques vers des fichiers de configuration situés dans le répertoire sites-available.

Sortie:

/etc/hosts:127.0.0.1 node2.domain.com

/etc/nginx/sites-available/domain.com: nom_serveur domain.com www.domain.com;

/etc/nginx/sites-enabled/domain.com: nom_serveur domain.com www.domain.com;

Afficher uniquement le nom du fichier

Pour supprimer la sortie par défaut et n'imprimer que les noms de fichiers contenant le motif correspondant, vous pouvez entrer l'option –l (ou —files-with-matches). Par exemple, pour rechercher tous les fichiers se terminant par .conf dans le répertoire de travail en cours et imprimer uniquement les noms de fichiers contenant le type domain.com, tapez:

$ –L domain.com * .conf

La sortie ressemblera à ceci:

tmux.conf

haproxy.conf

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

$ -Rl domain.com / tmp

Insensibilité à la casse

Par défaut, la commande est sensible à la casse, ce qui signifie que les caractères majuscules et minuscules sont traités de manière différente. Pour ignorer la casse lors de la recherche, entrez l’option –i (ou –ignore-case). Par exemple, si vous recherchez un Zebra sans aucune option, la commande suivante n’affiche aucune sortie, c.-à-d. il y a correspondance.

$ Zebra / usr / share / words

Mais si vous effectuez une recherche ne respectant pas la casse, utilisez l'option –i, elle correspondra aux lettres majuscules et minuscules:

$ grep -i Zebra / usr / share / words

L'indication «Zebra» correspond à «Zebra», «ZEbrA» ou à toute autre combinaison de lettres majuscules et minuscules.

Sortie:

zèbre

zèbre

zèbres

Match exact

Lors de la recherche, gnu imprimera également gnu, dans lequel seront insérés des mots plus gros, tels que cygnus ou magnum.

$ gnu / usr / share / words

Sortie:

cygnus

gnou

interrègne

lgnu9d

lignum

magnum

magnuson

sphaigne

aileron

Pour renvoyer uniquement les expressions dans lesquelles le champ spécifié est un mot entier (non entouré de mots), vous pouvez utiliser l'option –w (ou —word-regexp).

IMPORTANT Les caractères du mot incluent des caractères alphanumériques (az, AZ et 0-9) et des traits de soulignement (_). Tous les autres caractères sont traités comme des caractères non verbaux.

Si vous exécutez la même commande que ci-dessus, y compris l'option –w, la commande ne renverra que ceux qui incluent gnu en tant que mot séparé.

$ grep -w gnu / usr / share / words

Sortie: gnou

Afficher les chiffres

Pour afficher le nombre de lignes contenant un motif, utilisez le paramètre –n (ou –line-number). Cette option permet d’imprimer les correspondances sur la sortie standard avec le préfixe du numéro dans lequel elle a été trouvée. Par exemple, pour afficher à partir du fichier / etc / services contenant le préfixe bash avec le numéro correspondant, vous pouvez utiliser la commande suivante:

$ grep -n 10000 / etc / services

La sortie ci-dessous montre que les correspondances sont à 10423 et 10424.

Sortie:

10423: ndmp 10 000 / tcp

10424: ndmp 10000 / udp

En comptant

Pour imprimer le nombre de lignes correspondantes dans la sortie standard, utilisez le paramètre –c (ou –count). Dans l'exemple ci-dessous, nous comptons le nombre de comptes dotés du shell / usr / bin / zsh.

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

Sortie: 4

Plusieurs lignes (motifs)

L'opérateur OR peut combiner deux ou plusieurs modèles de recherche |. Par défaut, la commande interprète le modèle comme l'expression régulière principale, dans laquelle les métacaractères perdent leur signification particulière, et leurs versions avec une 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 journal des erreurs Nginx:

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

Si vous utilisez l'option d'expression régulière étendue –E (ou —extended-regexp), l'instruction ne doit pas être échappée, comme indiqué ci-dessous:

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

Expression régulière

GNU Grep a deux jeux de fonctions d’expression régulière: basique et étendu. Par défaut, la fonction interprète le modèle comme une expression régulière de base. Pour passer aux expressions régulières étendues, vous devez utiliser l'option –E. Lors de l'utilisation d'expressions régulières en mode principal, tous les autres caractères, à l'exception des métacaractères, sont en fait des expressions régulières qui se correspondent. Vous trouverez ci-dessous une liste des métacaractères les plus couramment utilisés:

  • Utilisez le caractère ^ (le caractère caret) pour faire correspondre l'expression au début d'une ligne. Dans l'exemple suivant, ^ kangourou ne correspond que s'il se produit au tout début: $ grep "^ kangaroo" file.txt
  • Utilisez le symbole $ (dollar) pour faire correspondre l'expression à la fin. Dans l'exemple suivant, kangourou $ ne correspond que s'il est rencontré à la toute fin: grep "kangourou $" fichier.txt
  • Utilisez le symbole. (point) pour faire correspondre n'importe quel caractère. Par exemple, pour faire correspondre tout ce qui commence par kan de deux caractères et se termine par roo, vous pouvez utiliser le modèle suivant: $ grep "kan..roo" file.txt
  • Utilisez [] (crochets) pour faire correspondre tout caractère isolé entre crochets. Par exemple, recherchez ceux qui contiennent accept ou "accent, vous pouvez utiliser le modèle suivant: $ grep" acce [np] t "fichier.txt

Pour éviter la signification particulière du caractère suivant, utilisez le caractère \ (barre oblique inverse).

Expressions régulières étendues

Pour interpréter un motif en tant qu'expression régulière étendue, utilisez le paramètre –E (ou –extended-regexp). Les expressions régulières étendues incluent tous les métacaractères de base, ainsi que des métacaractères supplémentaires permettant de créer des modèles de recherche plus complexes et plus puissants. Ci-dessous quelques exemples:

  • Match et extraire toutes les adresses e-mail de ce fichier: $ grep -E -o "\ b [A-Za-z0-9 ._% + -] [A-Za-z0-9 .-] + \. [A-Za-z] {2.6} \ b "fichier.txt
  • Mappez et extrayez toutes les adresses IP valides de ce fichier: $ 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]?) 'Fichier.txt

L'option -o est utilisée pour imprimer uniquement les correspondances.

Imprimer avant de compter

Pour imprimer un certain nombre de lignes avant la correspondance, utilisez le paramètre –B (ou —before-context). Par exemple, pour afficher 5 lignes de contexte initial avant la mise en correspondance, vous pouvez utiliser la commande suivante: $ grep -A 5 root / etc / passwd

Imprimer après la recherche

Pour imprimer un nombre spécifique de lignes après une correspondance, utilisez le paramètre –A (ou –après-contexte). Par exemple, pour afficher 5 lignes du contexte final après la mise en correspondance de chaînes, vous pouvez utiliser la commande suivante: $ grep -B 5 racine / etc / passwd

Tout cela est nécessaire à la pleine utilisation des informations de commandes. Si vous utilisez déjà Linux et pouvez conseiller les débutants, partagez des commentaires sous cet article.