Manipulation de texte avancée
Table des matières
- cut - Extraire des colonnes
- tr - Transformer des caractères
- sed - Éditeur de flux
- awk - Traitement avancé
- Combinaisons puissantes
- Exercices pratiques
1 - cut - Extraire des colonnes
Options principales
| Option | Description |
|---|---|
-d | Délimiteur |
-f | Champs à extraire |
-c | Caractères à extraire |
-b | Octets à extraire |
Exemples
# Extraire le premier champ (délimiteur :)
echo "alice:25:paris" | cut -d: -f1
# alice
# Plusieurs champs
echo "alice:25:paris" | cut -d: -f1,3
# alice:paris
# Plage de champs
echo "a:b:c:d:e" | cut -d: -f2-4
# b:c:d
# Depuis le champ N
echo "a:b:c:d:e" | cut -d: -f3-
# c:d:e
# Caractères
echo "Hello World" | cut -c1-5
# Hello
# Utilisateurs de /etc/passwd
cut -d: -f1,3 /etc/passwd
Cas pratiques
# Extraire les noms d'utilisateurs
cut -d: -f1 /etc/passwd
# Extraire IP d'un log
cat access.log | cut -d' ' -f1
# Extraire extension de fichiers
for f in *.txt; do
echo "$f" | cut -d. -f2
done
🔝 Retour à la table des matières
2 - tr - Transformer des caractères
Syntaxe
tr [options] SET1 [SET2]
Transformations
# Minuscules vers majuscules
echo "hello" | tr 'a-z' 'A-Z'
# HELLO
# Majuscules vers minuscules
echo "HELLO" | tr 'A-Z' 'a-z'
# hello
# Classes de caractères
echo "Hello World" | tr '[:lower:]' '[:upper:]'
# HELLO WORLD
# Remplacer des caractères
echo "hello world" | tr ' ' '_'
# hello_world
Options
| Option | Description |
|---|---|
-d | Supprimer les caractères |
-s | Squeeze (compresser les répétitions) |
-c | Complémentaire (tous sauf) |
# Supprimer les chiffres
echo "abc123def" | tr -d '0-9'
# abcdef
# Supprimer les non-chiffres
echo "abc123def" | tr -cd '0-9'
# 123
# Compresser les espaces multiples
echo "hello world" | tr -s ' '
# hello world
# Supprimer les retours chariot Windows
tr -d '\r' < windows.txt > unix.txt
Classes de caractères
| Classe | Description |
|---|---|
[:alnum:] | Alphanumériques |
[:alpha:] | Lettres |
[:digit:] | Chiffres |
[:lower:] | Minuscules |
[:upper:] | Majuscules |
[:space:] | Espaces |
[:punct:] | Ponctuation |
🔝 Retour à la table des matières
3 - sed - Éditeur de flux
Commandes de base
| Commande | Description |
|---|---|
s/old/new/ | Substitution |
d | Supprimer |
p | Afficher |
i | Insérer avant |
a | Ajouter après |
Substitution
# Remplacer première occurrence
echo "hello hello" | sed 's/hello/hi/'
# hi hello
# Remplacer toutes les occurrences
echo "hello hello" | sed 's/hello/hi/g'
# hi hi
# Insensible à la casse
echo "Hello HELLO" | sed 's/hello/hi/gi'
# hi hi
# Délimiteur alternatif
echo "/home/user" | sed 's|/home|/opt|'
# /opt/user
Adresses et plages
# Ligne spécifique
sed '3s/old/new/' fichier.txt # Ligne 3 seulement
# Plage de lignes
sed '2,5s/old/new/' fichier.txt # Lignes 2 à 5
# Depuis une ligne jusqu'à la fin
sed '10,$s/old/new/' fichier.txt
# Lignes correspondant à un pattern
sed '/error/s/foo/bar/' fichier.txt
Suppression
# Supprimer une ligne
sed '5d' fichier.txt
# Supprimer des lignes vides
sed '/^$/d' fichier.txt
# Supprimer les lignes contenant un pattern
sed '/debug/d' fichier.txt
# Supprimer les commentaires
sed '/^#/d' fichier.txt
Modification en place
# Modifier le fichier (-i)
sed -i 's/old/new/g' fichier.txt
# Avec backup
sed -i.bak 's/old/new/g' fichier.txt
Commandes multiples
# Avec -e
sed -e 's/foo/bar/' -e 's/baz/qux/' fichier.txt
# Avec point-virgule
sed 's/foo/bar/; s/baz/qux/' fichier.txt
# Depuis un fichier de commandes
sed -f commandes.sed fichier.txt
🔝 Retour à la table des matières
4 - awk - Traitement avancé
Structure
awk 'pattern { action }' fichier
Variables spéciales
| Variable | Description |
|---|---|
$0 | Ligne complète |
$1, $2... | Champs |
NF | Nombre de champs |
NR | Numéro de ligne |
FS | Séparateur d'entrée |
OFS | Séparateur de sortie |
Exemples de base
# Afficher le premier champ
awk '{print $1}' fichier.txt
# Plusieurs champs
awk '{print $1, $3}' fichier.txt
# Avec séparateur personnalisé
awk -F: '{print $1, $3}' /etc/passwd
# Numéro de ligne
awk '{print NR, $0}' fichier.txt
Patterns et conditions
# Lignes contenant "error"
awk '/error/ {print}' log.txt
# Condition sur un champ
awk '$3 > 100 {print $1, $3}' data.txt
# Plusieurs conditions
awk '$3 > 100 && $2 == "active" {print}' data.txt
# NR pour lignes spécifiques
awk 'NR >= 5 && NR <= 10' fichier.txt
Calculs
# Somme d'une colonne
awk '{sum += $3} END {print sum}' data.txt
# Moyenne
awk '{sum += $3; count++} END {print sum/count}' data.txt
# Maximum
awk 'BEGIN {max=0} $3 > max {max=$3} END {print max}' data.txt
# Compter les occurrences
awk '{count[$1]++} END {for (k in count) print k, count[k]}' data.txt
BEGIN et END
awk '
BEGIN { print "=== Rapport ===" }
{ total += $3 }
END { print "Total:", total }
' data.txt
Formatage
# printf
awk '{printf "%-20s %10.2f\n", $1, $3}' data.txt
# Séparateur de sortie
awk 'BEGIN {OFS=","} {print $1, $2, $3}' data.txt
🔝 Retour à la table des matières
5 - Combinaisons puissantes
Pipeline classique
# Top 10 des IPs dans un access log
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# Taille des fichiers par extension
find . -type f | sed 's/.*\.//' | sort | uniq -c | sort -rn
# Utilisateurs avec bash
grep "/bin/bash$" /etc/passwd | cut -d: -f1 | sort
Analyse de logs
# Erreurs par heure
grep ERROR app.log | cut -d' ' -f1 | cut -d: -f1 | uniq -c
# Requêtes HTTP 500
awk '$9 == 500 {print $7}' access.log | sort | uniq -c | sort -rn
# Temps de réponse moyen
awk '{sum += $NF; count++} END {print sum/count}' access.log
Transformation de données
# CSV vers JSON (simplifié)
awk -F, 'NR>1 {printf "{\"name\":\"%s\",\"age\":%s}\n", $1, $2}' data.csv
# Transposer colonnes/lignes
awk '{for(i=1;i<=NF;i++) a[NR,i]=$i} END {for(j=1;j<=NF;j++) {for(i=1;i<=NR;i++) printf "%s ", a[i,j]; print ""}}' data.txt
🔝 Retour à la table des matières
6 - Exercices pratiques
Exercice 1 : Extraire des informations
# À partir de /etc/passwd, afficher:
# nom_utilisateur -> shell
# pour les utilisateurs avec /bin/bash
Solution
awk -F: '$7 == "/bin/bash" {print $1 " -> " $7}' /etc/passwd
Exercice 2 : Nettoyer des données
# Nettoyer un fichier:
# - Supprimer les lignes vides
# - Supprimer les commentaires (#)
# - Convertir en minuscules
Solution
sed '/^$/d; /^#/d' fichier.txt | tr '[:upper:]' '[:lower:]'
Quiz
Q1. Comment extraire le 3e champ d'un fichier CSV ?
Réponse
cut -d, -f3 fichier.csv ou awk -F, '{print $3}' fichier.csv
Q2. Comment remplacer tous les espaces par des underscores ?
Réponse
tr ' ' '_' ou sed 's/ /_/g'
Q3. Comment calculer la somme d'une colonne avec awk ?
Réponse
awk '{sum += $N} END {print sum}' fichier
🔝 Retour à la table des matières
Points clés à retenir
- cut : extraction de colonnes (
-ddélimiteur,-fchamps) - tr : transformation caractère par caractère
- sed : substitution et édition de flux (
s/old/new/g) - awk : traitement orienté colonnes (
$1,$2, calculs) - Combiner avec pipes pour des traitements complexes
sed -ipour modifier en place (avec backup.bak)awk BEGIN/ENDpour initialisation et finalisation
🔝 Retour à la table des matières
← Chapitre précédent | Chapitre suivant : Expressions régulières →