Find - Grep - Sed

De Wiki info-lab.fr
Aller à : Navigation, rechercher

Sommaire

Rechercher un fichier

Voici différents utilitaires permettant de trouver un fichier à l'intérieur d'un système de fichiers .

locate

Recherche s'appuyant sur une base de données conservée dans le fichier /var/lib/mlocate/mlocate.db; Ne fonctionne que si le service en question est exécuté régulièrement pour mettre à jour cette base de données. Pour mettre à jour la base :

# updatedb

A utiliser si besoin avec cron pour automatiser la mise à jour.

find

Recherche directe sur un système de fichiers en parcourant toute ou partie de son arborescence. Gnu Find accepte de nombreux arguments et permet d'utiliser les filtres et expressions rationnelles.
Les expressions rationnelles sont utilisées par de nombreux programmes Unix/Linux tels que find, grep, sed, bash, vim, perl, emacs ...

Quelques exemples de syntaxe find :

$ find /chemin/de-ma-recherche [critère de recherche] [valeur du critère]
$ find /home/toto/ -name fichier1      (recherche dans le répertoire personnel de toto d'un fichier identifié par son nom)
$ find . -size 100M   (recherche dans le répertoire courant des fichiers supérieurs en taille à 100 Mo)
$ find /etc/ -ctime 30   (recherche dans le répertoire /etc/ des fichiers modifiés il y a moins de 30 jours)
$ find /home/toto/ -name "*.tmp" -exec rm {} \;    (suppression des fichiers .tmp trouvés dans le répertoire de toto)
# find /etc/ -type f -exec sha1sum {} \+  > file.txt     (recherche dans /etc des fichiers simples avec calcul d'empreinte SHA1 et envoi dans un fichier texte)
# recherche multicritère opérateur ET :
find /tmp -user stage1 -name '*.txt' -print
find /tmp \( -user stage1 -a -name '*.txt' \) -print  (même commande mais syntaxe plus propre) 
# recherche multicritère opérateur OU :
find /tmp \( -user stage1 -o -name '*.txt' \) -print
# recherche dans 2 répertoires et action sur le résultat :
find /usr/bin /usr/sbin -name 'svn*' -exec file {} \;
# recherche du bit SUID sur des fichiers :
find /bin /sbin /usr/bin /usr/sbin -perm -4000 -print
find /tmp -user 'stage1' -print > resultat.txt 2> /dev/null
find /tmp -user 'stage1' -print 1> resultat.txt 2> /dev/null
find /tmp -user 'stage1' -print 1> /dev/null 2>&1

Les expressions rationnelles sont composées des littéraux (les caractères normaux représentant le texte brut à rechercher) et des méta-caractères (caractères ayant un sens pour la recherche). Le méta-caractère spécial \ transforme le méta-caractère suivant en littéral. find nécessite l'argument -regex pour indiquer que la chaîne qui suit est une expression rationnelle, expression qui doit être encadrée entre apostrophes droites ( 'expression' ) pour éviter d'être interpréter par le shell (Bash ou un autre).
LISTE NON EXHAUSTIVE DES CRITERES DE RECHERCHE -name nom du fichier
-user ou -group nom d'utilisateur ou de groupe auquel appartient un fichier
-uid ou -gid idem avec les numéros d'utilisateur et de groupe
-mtime 3 date de modification, il y a 3 jours
-atime 3 date d'accès, il y a 3 jours
-perm 700 dont les permissions sont rwx------
-executable type exécutable (y compris par ACL)
-num 519 numéro d'inode 519
-links 3 ayant 3 liens
-nogroup ou -nouser fichier dont le GID ou UID ne correspond à aucun utilisateur ou groupe.
-size 5k de taille 5 Ko
-size +5k supérieur à 5 Ko
-type d répertoire
-writable droits en écriture (y compris par ACL)
-readable droits en lecture (y compris par ACL)

whereis

Commande particulière qui permet de ne chercher que les fichiers correspondant à des commandes systèmes : exécutables, sources et pages de manuel.

$ whereis pwd
  pwd: /bin/pwd /usr/include/pwd.h /usr/share/man/man1/pwd.1.gz

Expressions rationnelles

Moyen simple et efficace d'effectuer de puissants traitements sur du texte : Appelées aussi expressions réglières (mauvaise traduction de regulars expressions), ou regexp ou regex : Utilisées le plus souvent pour faire de la recherche/remplacement de motifs complexes, la norme POSIX 1003.2 tente d'harmoniser les différences de syntaxe employées par emacs, perl, vi, sed, awk...

Liste des caractères spéciaux : / \ | ( ) [ ] { } ^ $ * + ? ! 
  • \ transforme le méta-caractère (caratère spécial) suivant en littéral.
  • ^terme recherche uniquement en début de ligne.
  • terme$ recherche uniquement en fin de ligne.

Définition de classes (entre crochets) :

  • [eai] toutes les occurrences possibles parmi e, a et i ; OU logique entre e, a et i.
  • [012] idem : Soit 0, soit 1 ou soit 2.
  • [0-9] n'importe quel chiffre de la liste 0 à 9.
  • [a-z] une des lettres de l'alphabet en minuscules.
  • [A-Z0-9] une des lettres de l'alphabet en majuscules suivie d'un chiffre.
  • [^abc] Tout sauf a, b ou c en minuscule.

Sous-expression (entre parenthèses) et séparées par des | :

  • (en|an|in|un) Soit en, soit an, soit in, soit un.

Joker, répétition et quantification :

  • . Une occurrence de n'importe quel caractère une fois (1 et 1 seule fois).
  • + Une occurrence d'au moins un caractère (1 ou plus).
  • ? Une occurrence de maximum 1 caractère (0 ou 1).
  • * Une occurrence apparaissant N fois (N = ensemble des entiers naturels de 0 à l'infini)
  • {n} Exactement n fois
  • {n,} au moins n fois (supérieur ou égal à n)
  • {n1,n2} entre n1 et n2 fois (n1<n2)
  • {,n} au plus n fois (inférieur ou égal à n)

Traitement dans un fichier

sed -e 'liste d'instructions' fichier-a-traiter
sed -f fichier-de-directives fichier-a-traiter

sed (Stream EDitor), éditeur de texte non interactif, lit un fichier ligne par ligne et l'affiche en le modifiant selon des critères définis à l'aide d'expressions rationnelles. Par défaut, sed affiche toutes les lignes qu'il lit (sauf emploi de l'option -n), vers la sortie standard (STDOUT).
Syntaxe standard : sed [-n] [-e commande] [-f fichier de directives] [fichier-cible]

  • Si une seule commande (ou directive) est utilisée, -e est optionnel
  • Si plusieurs directives sont utilisées, -e est obligatoire
  • Si de nombreuses directives sont utilisées et qu'en saisir la liste derrière -e est trop fastidieux, il faut privilégier la création d'un fichier contenant toutes les directives, fichier désigné par l'option -f. Ce fichier de directives a aussi l'avantage d'être plus facilement réutilisable pour le même traitement ou des traitements similaires sur d'autres fichiers cibles.

EXEMPLES :

$ sed -n "/^[A-Z]/p" lettre1    (affichage p=print des lignes du fichier "lettre1" commençant par une majuscule de A à Z)
 Cherbourg le ......
 Cher Monsieur
 C'est avec insistance que je vous écrit ....
 Veuillez trouver l'expression de mes sentiments les plus chers.
$ sed -e '2,4p'  </etc/passwd      (affichage des lignes 2 à 4 du ficher /etc/passwd)
$ sed -e '/^#/d' </etc/passwd      (affichage des lignes du ficher /etc/passwd en supprimant [d=delete] celles qui commencent par #)

Ne possédant pas la puissance de grep pour une recherche récursive de contenu, sed est souvent utilisé au sein de scripts pour effectuer de l'extraction d'éléments puisés dans des fichiers textes.

$ sed -e '1,5d' fichier-cible     (affichage du fichier en supprimant les 5 premières lignes).
$ sed -e '1,5!d' fichier-cible     (l'inverse, donc uniquement affichage des 5 premières lignes).
$ sed -e 's/nom/Nom/' fichier-cible     (affichage du fichier en substituant chaque occurence de nom par Nom).

ATTENTION : sed parcourt chaque ligne et par défaut n'effectue qu'un seul traitement par ligne. Pour pallier à cette limitation utiliser l'opérateur g

$ sed -e 's/nom/Nom/g' fichier-cible     (plusieurs occurences du motif nom présentes sur la même ligne seront subtituées par Nom)
$ sed -e 's/nom/Nom/gw fichier-resultat' fichier-cible      (idem mais en enregistrant [w=write] le traitement dans le fichier "fichier-resultat")

La redirection de la commande sed vers un fichier au moyen de > fonctionne aussi.

$ sed -e 's@/etc/passwd@/etc/shadow@gw fichier-resultat' fichier-cible      (@ permettra de ne pas interprêter les / comme des opérateurs et séparateurs mais comme un simple caractère)

Rechercher à l'intérieur d'un fichier

grep permet d'afficher la ligne d'un fichier contenant le motif ou l'expression rationnelle précisée.

$ ls | grep "I"
 Images
 Ipod
$ grep "^[A-Z]" lettre1       (affichage des lignes du fichier commençant par une majuscule de A à Z)
 Cherbourg le ......
 Cher Monsieur
 C'est avec insistance que je vous écrit ....
 Veuillez trouver l'expression de mes sentiments les plus chers.
$ grep -c "^[A-Z]" lettre1 (comptabiliser les lignes qui correspondent à ce critère)
 4
$ grep "Ch" lettre1    (les lignes qui commencent par cette chaîne de caractère)
 Cherbourg le ......
 Cher Monsieur 
$ grep -i "Ch" lettre1       (Pas de prise en compte de la casse)
 Cherbourg le ......
 Cher Monsieur
 Veuillez trouver l'expression de mes sentiments les plus chers.
$ grep -in "Ch" lettre1       (Pas de prise en compte de la casse et numérotation des lignes, l'option --color permet de coloriser les numéros de lignes )
 1:Cherbourg le ......
 2:Cher Monsieur
 14:Veuillez trouver l'expression de mes sentiments les plus chers.
$ grep -f fichierListe fichier1  (le fichier fichierListe contient l'ensemble des expressions régulières à rechercher dans fichier1, une expression par ligne)
$ grep -i "Ch" *      (recherche dans tous les fichiers à mon niveau d'arborescence)
$ grep -r "Ch" *      (recherche récursive dans tous les sous-répertoires. grep -r équivaut à rgrep.)
Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils