Aller au contenu
Administration Linux medium

Transformer du texte avec cut, tr et paste

15 min de lecture

Un fichier de log vous donne trop d’informations d’un coup. Un CSV a les colonnes dans le mauvais ordre. Deux listes doivent être assemblées côte à côte avant d’être traitées. Dans ces situations, les outils graphiques ne servent à rien — c’est cut, tr et paste qui font le travail en une seule ligne de commande.

Ces trois outils font partie de la famille des filtres Unix. Ils lisent du texte, le transforment et l’écrivent — sans fichier intermédiaire, sans interface, entièrement composables par pipe. cut extrait, tr remplace, paste assemble. Ensemble, ils permettent de préparer des données pour d’autres outils (sort, awk, sed, scripts Bash) avec une efficacité difficile à surpasser.

Vous avez vu cut et tr dans les fondamentaux. Ce guide va plus loin : options avancées, cas d’usage réels en administration, erreurs fréquentes et combinaisons pratiques.

  • Extraire des champs multiples, des plages et des compléments avec cut
  • Convertir des jeux de caractères, supprimer et réduire avec tr
  • Fusionner plusieurs fichiers ou flux en colonnes avec paste
  • Combiner ces trois outils dans des pipelines d’administration courants

Vous manipulez rarement du texte pour le plaisir. Vous le faites parce qu’un outil vous donne plus que ce dont vous avez besoin — et vous devez extraire l’essentiel avant de le passer à un autre outil. Concrètement : vous récupérez un export CSV d’un inventaire avec 20 colonnes et vous n’en avez besoin que de 3 ; un log applicatif mélange majuscules et minuscules et votre script de comparaison est sensible à la casse ; deux fichiers de référence doivent être fusionnés côte à côte avant d’être chargés dans un rapport. Ces trois situations reviennent chaque semaine dans un travail d’administration ou de CI/CD, et cut, tr, paste les règlent en une ligne, sans fichier temporaire ni script Python.

Fenêtre de terminal
cut -d: -f1 /etc/passwd # champ 1, délimiteur :
cut -c1-10 fichier.txt # caractères 1 à 10

Si ces deux lignes ne vous sont pas familières, commencez par le guide Filtrer et transformer du texte en fondamentaux.

cut accepte une liste de champs séparés par des virgules, ou une plage avec le tiret :

Fenêtre de terminal
# Champs 1, 3 et 5 du fichier passwd
cut -d: -f1,3,5 /etc/passwd
# Champs 1 à 3 (plage)
cut -d: -f1-3 /etc/passwd
# Du champ 4 jusqu'à la fin de la ligne
cut -d: -f4- /etc/passwd
# Du premier caractère jusqu'au 5e
cut -c-5 fichier.txt

L’option --complement sélectionne tout sauf les champs indiqués. Elle n’est disponible que dans GNU cut (Linux) :

Fenêtre de terminal
# Tout sauf le champ 2 (le mot de passe) dans /etc/passwd
cut -d: --complement -f2 /etc/passwd

C’est utile pour anonymiser rapidement une colonne sensible dans un fichier sans réécrire les autres.

Par défaut, cut réutilise le même délimiteur en sortie. Pour en choisir un autre, il faut passer par tr ou awk. Voici comment obtenir une sortie CSV depuis un fichier : délimité :

Fenêtre de terminal
cut -d: -f1,3,6 /etc/passwd | tr ':' ','
Sortie (extrait)
root,0,/root
bob,1000,/home/bob

cut travaille sur des positions fixes — il n’est pas adapté quand les colonnes ont des largeurs variables (espaces multiples). Dans ce cas, awk est plus puissant.

Fenêtre de terminal
# Mauvais résultat si plusieurs espaces séparent les colonnes
ps aux | cut -d' ' -f3 # résultat imprévisible avec des espaces multiples
# Mieux avec awk
ps aux | awk '{print $3}' # toujours correct

tr (translate) lit depuis l’entrée standard et transforme ou supprime des caractères. Il ne travaille jamais avec des fichiers directement — toujours via un pipe ou une redirection.

La syntaxe de base : tr 'ensemble1' 'ensemble2'

Fenêtre de terminal
# Majuscules → minuscules
echo "ERREUR CRITIQUE" | tr 'A-Z' 'a-z'
# Minuscules → majuscules
cat /etc/hostname | tr 'a-z' 'A-Z'
# Remplacer les espaces par des underscores (noms de fichiers)
echo "mon fichier de log.txt" | tr ' ' '_'
Fenêtre de terminal
# Supprimer tous les chiffres d'une ligne
echo "erreur-404-page-not-found" | tr -d '0-9'
# Supprimer les retours chariot Windows (\r) d'un fichier copié depuis Windows
tr -d '\r' < fichier-windows.txt > fichier-unix.txt
# Supprimer les espaces
echo " root : 0 " | tr -d ' '

L’option -s (squeeze) réduit les répétitions consécutives d’un caractère en une seule occurrence :

Fenêtre de terminal
# Réduire les espaces multiples en un seul
echo "root : 0 : /root" | tr -s ' '
Sortie
root : 0 : /root
Fenêtre de terminal
# Réduire les lignes vides dans un fichier (plusieurs \n consécutifs)
tr -s '\n' < fichier-avec-lignes-vides.txt

Pratique pour normaliser la sortie de commandes comme df, ps ou netstat qui utilisent des espaces variables.

tr accepte des classes POSIX entre [: et :] :

Fenêtre de terminal
tr '[:upper:]' '[:lower:]' # équivalent A-Z → a-z, mais compatible avec les accents
tr -d '[:space:]' # supprimer tous les espaces (espace, tab, newline...)
tr -d '[:punct:]' # supprimer toute la ponctuation
tr -d '[:digit:]' # supprimer les chiffres

Attention à utiliser des guillemets simples autour des chaînes contenant !, # ou $ pour éviter l’interprétation par le shell :

Fenêtre de terminal
echo 'abc123!@#' | tr -d '[:digit:]' # → abc!@#
echo 'abc123!@#' | tr -d '[:punct:]' # → abc123
Fenêtre de terminal
# Normaliser un fichier CSV exporté depuis Excel (séparateur ; → ,)
tr ';' ',' < export.csv > export-normalise.csv
# Extraire le premier segment de chemin des URL dans un log Apache
# (format combined : ... "GET /blog/page HTTP/1.1" ...)
grep 'GET' /var/log/apache2/access.log | cut -d'"' -f2 | cut -d' ' -f2 | cut -d'/' -f2 | sort -u
# Préparer une liste de paquets (un par ligne → une seule ligne pour apt install)
cat paquets.txt | tr '\n' ' '

paste est moins connu que cut et tr, mais très utile pour assembler plusieurs fichiers ou flux côte à côte.

Imaginons deux fichiers :

noms.txt
alice
bob
charlie
roles.txt
admin
user
user
Fenêtre de terminal
paste noms.txt roles.txt
Sortie
alice admin
bob user
charlie user

Par défaut, paste sépare les colonnes par une tabulation.

Fenêtre de terminal
paste -d',' noms.txt roles.txt
Sortie
alice,admin
bob,user
charlie,user

Vous pouvez chaîner plusieurs délimiteurs différents pour assembler trois fichiers ou plus :

Fenêtre de terminal
paste -d':,' noms.txt roles.txt uid.txt

paste alterne entre : et , à chaque champ.

L’option -s (serial) fusionne toutes les lignes d’un fichier en une seule ligne :

Fenêtre de terminal
paste -s noms.txt
Sortie
alice bob charlie

C’est l’équivalent de tr '\n' '\t', mais avec un contrôle sur le délimiteur.

Fenêtre de terminal
# Générer une liste inline pour une commande
paste -sd',' noms.txt
Sortie
alice,bob,charlie

Combine paste avec la commande nl (ou cat -n) pour numéroter des lignes :

Fenêtre de terminal
nl -ba noms.txt | paste -d' ' - roles.txt

Ou plus simplement :

Fenêtre de terminal
paste <(nl -ba noms.txt) roles.txt
Fenêtre de terminal
# Comparer les utilisateurs locaux avec leurs UIDs
paste <(cut -d: -f1 /etc/passwd) <(cut -d: -f3 /etc/passwd)
Sortie (extrait)
root 0
daemon 1
bob 1000

Fenêtre de terminal
ss -tn | grep ESTABLISHED | tr -s ' ' | cut -d' ' -f5 | cut -d: -f1 | sort -u
  1. ss -tn : connexions TCP actives
  2. tr -s ' ' : normalise les espaces multiples
  3. cut -d' ' -f5 : extrait la colonne adresse distante
  4. cut -d: -f1 : enlève le port
  5. sort -u : déduplique
Fenêtre de terminal
cut -d: -f1,3,6 /etc/passwd | tr ':' ',' > utilisateurs.csv
Fenêtre de terminal
# Deux listes triées de paquets installés (avant/après)
comm -13 <(sort avant.txt) <(sort apres.txt)
Fenêtre de terminal
tr -d '\r' < script.sh > script-clean.sh
chmod +x script-clean.sh

Générer une liste inline de services à démarrer

Section intitulée « Générer une liste inline de services à démarrer »
Fenêtre de terminal
cat services.txt | paste -sd' ' | xargs systemctl start

ProblèmeCause probableSolution
cut retourne des champs videsDélimiteur incorrectVérifier avec cat -A fichier — les tabulations s’affichent ^I
cut --complement non reconnuSystème non-GNU (macOS, BSD)Utiliser awk à la place
tr : tr: extra operandTrop d’argumentstr ne prend que deux ensembles — vérifier la syntaxe
tr : caractères non transformésLocale différenteUtiliser les classes POSIX [:upper:] au lieu de A-Z
paste : colonnes décaléesFichiers avec un nombre de lignes différentVérifier avec wc -lpaste remplit avec des vides si inégal
paste : tabulations non vouluesDélimiteur par défautAjouter -d',' ou -d' ' pour choisir
Rien ne s’affiche avec trOubli du pipe ou de la redirectiontr lit stdin — utiliser `echo ”…“

  • cut extrait des colonnes par position ou par délimiteur. -f4- sélectionne du champ 4 à la fin. --complement inverse la sélection (GNU uniquement).
  • tr transforme caractère par caractère depuis stdin. -d supprime, -s réduit les répétitions. Les classes POSIX ([:upper:], [:digit:]) sont plus portables que les plages A-Z.
  • paste assemble des fichiers en colonnes. -d contrôle le délimiteur, -s fusionne toutes les lignes d’un fichier sur une seule ligne.
  • Ces trois outils sont pensés pour le pipe — ils ne modifient jamais les fichiers source.
  • Quand les colonnes ont des largeurs variables (espaces multiples), préférer awk à cut.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn