====== 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 : * ''--color'' : met en couleur ce qui est recherché (permet de voir plus vite si c'est bien le bon truc). * ''-C N'' (N est un nombre) : affiche les lignes avant et après, afin d'avoir le contexte. Chaque bloc est séparé par des doubles tirets. * ''-A N'' : idem mais uniquement les lignes après l’occurrence ("after"). * ''-B N'' : idem mais uniquement les lignes avant l’occurrence ("before"). 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 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.