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.
Geany
La fonction “rechercher et remplacer” de Geany est puissante mais… je galère toujours un peu à retrouver la syntaxe quand je sors des trucs les plus basiques. La doc :
- https://www.geany.org/manual/gtk/glib/glib-regex-syntax.html (toutes les possibilités en détail)
Par ailleurs, il est possible de remplacer une partie seulement de l'expression, en utilisant le système de “tag”. Un tag est entouré par des parenthèses. Donc on fera (.*) dans l'expression de recherche (par exemple), et on indiquera \1 dans le remplacement. On peut faire de 1 à 9 tags.
Exemple en cherchant à remplacer les premiers items d'une liste par une version en gras pour dokuwiki. On cherche (en échappant dans la recherche les caractères communs à Dokuwiki et au parsing de Geany) :
\* (.*) \:
Et on remplace par
* **\1** :