Skip to main content

3.4 - Trier et transformer avec sort, uniq, cut, sed et awk

Les petits outils Unix sont conçus pour être combinés. Ils permettent d'extraire une information sans ouvrir un tableur ou écrire un programme complet.

Compter avec wc

wc fichier.txt
wc -l fichier.txt       # lignes
wc -w fichier.txt       # mots
wc -c fichier.txt       # octets

Trier et supprimer les doublons

sort noms.txt
sort -n nombres.txt
sort -h tailles.txt
sort -r noms.txt
sort noms.txt | uniq
sort noms.txt | uniq -c | sort -nr

uniq ne regroupe que les lignes identiques adjacentes ; il est donc souvent précédé de sort.

Extraire des colonnes

cut -d: -f1 /etc/passwd
cut -d';' -f1,3 inventaire.csv

cut convient aux séparateurs simples. Un CSV avec des guillemets, des retours à la ligne ou des séparateurs échappés nécessite un véritable analyseur CSV.

Remplacer des caractères avec tr

printf '%s\n' 'bonjour' | tr '[:lower:]' '[:upper:]'
tr -d '\r' < windows.txt > linux.txt
tr ':' '\n' < /etc/passwd

Transformer avec sed

Afficher sans modifier :

sed -n '1,10p' fichier.txt
sed 's/ancien/nouveau/g' fichier.txt
sed '/^#/d; /^$/d' fichier.conf

Créer un nouveau fichier :

sed 's/ancien/nouveau/g' fichier.txt > fichier-modifie.txt

La modification directe sed -i varie entre GNU/Linux et BSD/macOS. Créer d'abord une sauvegarde :

sed -i.bak 's/ancien/nouveau/g' fichier.txt

Extraire avec awk

awk -F: '{print $1}' /etc/passwd
awk '{print NR, $0}' fichier.txt
awk '$3 > 80 {print $1, $3}' mesures.txt
df -P | awk 'NR>1 {print $6, $5}'

Dans awk, $1 désigne le premier champ, $0 toute la ligne et NR le numéro de ligne.

Exemple combiné

Compter les shells déclarés dans /etc/passwd :

cut -d: -f7 /etc/passwd | sort | uniq -c | sort -nr

Tester d'abord les transformations sans -i, comparer le résultat avec diff, puis remplacer le fichier uniquement après validation.