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 <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.