En une ligne, on souhaite trouver dans quels fichiers se trouve la chaine CHAINE, lister leur chemin (relatif à notre position), et afficher les lignes contenant le fameux texte CHAINE.
grep recursif :
ou avec les couleurs, si votre grep et configuration le permettent :
Code : Sélectionner tout - Visualiser dans une fenêtre à part grep -Rn "CHAINE" mon_repertoire/
find + grep non récursif :
Code : Sélectionner tout - Visualiser dans une fenêtre à part grep --color -Rn "CHAINE" mon_repertoire/
Si on veut border la recherche avec des conditions plus strictes, par exemple, aux fichiers *.sh dont vous êtes l'utilisateur et qui sont executables :
------------------- on pourrait s'arrêter là pour la FAQ, sinon pour l'arrachage de cheveux ----------
Code : Sélectionner tout - Visualiser dans une fenêtre à part find depuis_ce_repertoire/ -type f -user moi_hornetbzz -perm /u+x -name "*.sh" -exec grep --color -Hn "CHAINE" {} 2>/dev/null \;
Pour l'exercice, une version Debian/Ubuntu si vous avez les couleurs dans votre terminal :
La combinaison de 3 commandes de base find, grep et sed va nous permettre cela :
Il y a très certainement une myriade d'autres solutions plus élégantes, en utilisant d'autres fonctions telles que awk/gawk ou bien en langage Perl. L'avantage de celle-ci réside dans l'utilisation de 3 commandes essentielles présentes dans toutes les distributions Linux, et dans la possibilité de sélectionner des fichiers particuliers (de type shell, et/ou avec les permissions executables et/ou appartenant à tel ou tel utilisateur etc...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 DIR="mon_rep_de_recherche"; F_PATTERN="*"; CHAIN="ma_chaine_à_trouver"; COLOR=$'\033[1;33;40m'; \ OFF=$'\E[0m'; find $DIR -type f -name "$F_PATTERN" -print0 | \ while read -r -d "$(printf "\000")" -r path;\ do [[ $(grep -r "$CHAIN" $path) ]] && ((count++)) && \ echo -e "\nfile $count: $path" && (grep -n "$CHAIN" $path | \ sed -e "s/^\(.*\)/line \1/" -e 's/\('"$CHAIN"'\)/'"$COLOR"'\1'"$OFF"'/' ) ;\ done
[EDITED]
Nota1: sed est utilisé dans son contexte "éditeur" et non "remplacement" de texte à proprement dit. Cette commande pourrait être omise.
Nota2: la commande fonctionne en ligne de commande. Pour l'utiliser en Bourne Shell dans un script (#!/bin/sh) au lieu de Bash (#!/bin/bash) , il faudrait modifier ((count++)) par count=$((count+1)).
Nota3: pour les développeurs qui utilisent Eclipse, cette commande est l'équivalent d'un search string. L'application évidente est la vérification ponctuelle de code sur un serveur en production.
Partager