Table des matières

Trouver et remplacer des informations

Avec grep

Chercher une info dans un tas de log dans un dossier et sortir les résultats dans un fichier à part :

grep -i -e "Recherche" log_NAME*.txt > nomfichier.txt

Mais pour du récursif j'ai pas encore trouvé bien probant. Celle-ci marche mais va chercher dans tous les types de fichiers.

grep -nri "Recherche" > nomfichier.txt

Si les dossiers sont de même profondeur (cas des logs), ceci peut marcher :

grep -nri "Recherche" log/2020/*/*.log

Autres options sympas de grep :

Pour afficher seulement les fichiers où apparait ce qu'on cherche, c'est -l. Et donc, de façon récursive, sans tenir compte de la case, pour n'afficher que le nom des fichiers :

grep -lri "truc" dossier/*

Avec find

Pour chercher une chaîne de caractères uniquement dans les fichiers d'une certaine extension (pour l'exemple les fichiers .txt) :

find . -type f -iname '*.txt' -exec grep -i "recherche" {} \;

Pour remplacer une chaîne de caractère dans des tas de fichier (ORIGINE) par une autre chaîne de caractère (REMPLACANT) et de façon récursive. Caractère d'échappement \ parfois nécessaire, entre autre devant [ :

find . -type f -exec sed -i 's#ORIGINE#REMPLACANT#g' {} \;

Pour transformer les majuscules en minuscules (grâce à tr) dans les noms de dossier (à faire plusieurs fois pour le récursif ? :

find . -type d|while read d; do mv $d `echo $d |tr '[:upper:]' '[:lower:]'`; done

Puis dans les noms de fichiers :

find . -type f|while read f; do mv $f `echo $f |tr '[:upper:]' '[:lower:]'`; done

Chercher seulement un fichier précis, quelque part :

find /chemin/ -iname <fichier>

On ajoute -type X pour préciser si c'est un fichier (f), un dossier (d) ou un lien symbolique (l) :

  find /chemin/ -type f -iname machin.txt

Fichiers trop longs

Dans le cas des fichiers de log trop longs, que grep et les éditeurs de texte n'arrivent plus à lire (erreurs variées), on découpe le fichier en plusieurs morceaux.

On créé un dossier où mettre les morceaux, puis on coupe toutes les 1000 lignes :

mkdir canal.log.d 
split -l 10000 \#canal.log canal.log.d/part.