Aller au contenu principal

Manipulation de texte avancée


Table des matières

  1. cut - Extraire des colonnes
  2. tr - Transformer des caractères
  3. sed - Éditeur de flux
  4. awk - Traitement avancé
  5. Combinaisons puissantes
  6. Exercices pratiques


1 - cut - Extraire des colonnes

Options principales

OptionDescription
-dDélimiteur
-fChamps à extraire
-cCaractères à extraire
-bOctets à 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

OptionDescription
-dSupprimer les caractères
-sSqueeze (compresser les répétitions)
-cComplé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

ClasseDescription
[: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

CommandeDescription
s/old/new/Substitution
dSupprimer
pAfficher
iInsérer avant
aAjouter 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

VariableDescription
$0Ligne complète
$1, $2...Champs
NFNombre de champs
NRNuméro de ligne
FSSéparateur d'entrée
OFSSé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 (-d délimiteur, -f champs)
  • 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 -i pour modifier en place (avec backup .bak)
  • awk BEGIN/END pour initialisation et finalisation

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Expressions régulières →