Bash : outils de traitement de texte
Les scripts s’appuient sur de petits outils qui se combinent avec des pipes. Les exemples utilisent des noms génériques.
grep : chercher
Section intitulée « grep : chercher »grep "erreur" journal.log # lignes contenant « erreur »grep -i "erreur" journal.log # sans tenir compte des majusculesgrep -v "debug" journal.log # lignes qui NE contiennent PAS « debug »grep -n "erreur" journal.log # avec les numéros de lignegrep -c "erreur" journal.log # nombre de lignesgrep -r "motif" /etc/nginx # récursif dans un dossiergrep -E "erreur|warning" journal.log # expression régulière étendue (OU)grep -q "motif" fichier # silencieux : sert uniquement au code de sortiegrep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" journal.log # n'affiche que ce qui correspond (adresses IPv4)sed : remplacer
Section intitulée « sed : remplacer »sed 's/ancien/nouveau/' fichier # 1re occurrence de chaque lignesed 's/ancien/nouveau/g' fichier # toutes les occurrencessed -i 's/ancien/nouveau/g' fichier # modifie le fichier sur placesed -i.bak 's/a/b/g' fichier # idem, avec copie de sauvegarde fichier.baksed -n '5,10p' fichier # affiche les lignes 5 à 10sed '/^#/d' fichier # supprime les lignes de commentairessed '/^$/d' fichier # supprime les lignes videsawk : colonnes et calculs
Section intitulée « awk : colonnes et calculs »awk '{print $1}' fichier # 1re colonne (séparateur : espaces)awk -F: '{print $1, $3}' /etc/passwd # séparateur « : » : nom et identifiantawk '$3 >= 1000 {print $1}' FS=: /etc/passwd # filtre : identifiants >= 1000awk '{somme += $1} END {print somme}' nombres.txt # somme d'une colonneawk 'NR > 1' fichier # toutes les lignes sauf la premièrecut, sort, uniq, wc, tr
Section intitulée « cut, sort, uniq, wc, tr »cut -d: -f1 /etc/passwd # 1er champ, séparateur « : »cut -d, -f2,4 donnees.csv # colonnes 2 et 4 d'un CSV simple
sort fichier # tri alphabétiquesort -n fichier # tri numériquesort -rn fichier # numérique, décroissantsort -u fichier # supprime les doublonssort -k2 fichier # tri sur la 2e colonne
uniq -c # compte les lignes identiques consécutives (après sort)
wc -l fichier # nombre de ligneswc -w fichier # nombre de mots
tr 'a-z' 'A-Z' <<< "texte" # majusculestr -d '\r' < windows.txt # supprime les retours chariot Windowstr -s ' ' <<< "a b" # réduit les espaces répétéshead, tail
Section intitulée « head, tail »head -n 5 fichier # 5 premières lignestail -n 5 fichier # 5 dernières lignestail -f /var/log/syslog # suit un fichier en direct (Ctrl+c pour quitter)tail -n +2 fichier # à partir de la ligne 2find : trouver des fichiers
Section intitulée « find : trouver des fichiers »find /var/log -name "*.log" # par nomfind . -type f -size +100M # fichiers de plus de 100 Mofind . -type d -name "cache" # dossiersfind . -type f -mtime -1 # modifiés depuis moins d'un jourfind . -type f -mtime +30 # modifiés il y a plus de 30 joursfind . -name "*.tmp" -delete # supprime les fichiers trouvésfind . -name "*.sh" -exec chmod +x {} \; # exécute une commande sur chaque fichierfind . -name "*.log" -print0 | xargs -0 gzip # avec xargs, noms robustesjq : lire du JSON
Section intitulée « jq : lire du JSON »sudo apt install jqcurl -s https://api.exemple.com/etat | jq '.statut' # une valeurcurl -s https://api.exemple.com/liste | jq -r '.[].nom' # une liste de noms (-r : sans guillemets)Exemples combinés
Section intitulée « Exemples combinés »# Adresses IP les plus présentes dans un journal d'accèsawk '{print $1}' acces.log | sort | uniq -c | sort -rn | head -10
# Nombre de lignes d'erreur par jourgrep -i "erreur" journal.log | cut -d' ' -f1 | sort | uniq -c
# Utilisateurs avec un shell de connexionawk -F: '$7 ~ /bash|sh$/ {print $1}' /etc/passwdUbuntu 24.04 et 26.04 : différences à connaître
Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuels :
man grep,man sed,man awk,man find - Documentation de
jq: jqlang.github.io/jq