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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »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.
cut — extraire avec précision
Section intitulée « cut — extraire avec précision »Rappel de la syntaxe de base
Section intitulée « Rappel de la syntaxe de base »cut -d: -f1 /etc/passwd # champ 1, délimiteur :cut -c1-10 fichier.txt # caractères 1 à 10Si ces deux lignes ne vous sont pas familières, commencez par le guide Filtrer et transformer du texte en fondamentaux.
Extraire plusieurs champs et des plages
Section intitulée « Extraire plusieurs champs et des plages »cut accepte une liste de champs séparés par des virgules, ou une plage avec le tiret :
# Champs 1, 3 et 5 du fichier passwdcut -d: -f1,3,5 /etc/passwd
# Champs 1 à 3 (plage)cut -d: -f1-3 /etc/passwd
# Du champ 4 jusqu'à la fin de la lignecut -d: -f4- /etc/passwd
# Du premier caractère jusqu'au 5ecut -c-5 fichier.txtInverser la sélection avec --complement
Section intitulée « Inverser la sélection avec --complement »L’option --complement sélectionne tout sauf les champs indiqués. Elle n’est disponible que dans GNU cut (Linux) :
# Tout sauf le champ 2 (le mot de passe) dans /etc/passwdcut -d: --complement -f2 /etc/passwdC’est utile pour anonymiser rapidement une colonne sensible dans un fichier sans réécrire les autres.
Changer le séparateur de sortie
Section intitulée « Changer le séparateur de sortie »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é :
cut -d: -f1,3,6 /etc/passwd | tr ':' ','root,0,/rootbob,1000,/home/bobLimites de cut
Section intitulée « Limites de cut »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.
# Mauvais résultat si plusieurs espaces séparent les colonnesps aux | cut -d' ' -f3 # résultat imprévisible avec des espaces multiples
# Mieux avec awkps aux | awk '{print $3}' # toujours correcttr — convertir et nettoyer
Section intitulée « tr — convertir et nettoyer »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.
Convertir des jeux de caractères
Section intitulée « Convertir des jeux de caractères »La syntaxe de base : tr 'ensemble1' 'ensemble2'
# Majuscules → minusculesecho "ERREUR CRITIQUE" | tr 'A-Z' 'a-z'
# Minuscules → majusculescat /etc/hostname | tr 'a-z' 'A-Z'
# Remplacer les espaces par des underscores (noms de fichiers)echo "mon fichier de log.txt" | tr ' ' '_'Supprimer des caractères avec -d
Section intitulée « Supprimer des caractères avec -d »# Supprimer tous les chiffres d'une ligneecho "erreur-404-page-not-found" | tr -d '0-9'
# Supprimer les retours chariot Windows (\r) d'un fichier copié depuis Windowstr -d '\r' < fichier-windows.txt > fichier-unix.txt
# Supprimer les espacesecho " root : 0 " | tr -d ' 'Réduire les répétitions avec -s (squeeze)
Section intitulée « Réduire les répétitions avec -s (squeeze) »L’option -s (squeeze) réduit les répétitions consécutives d’un caractère en une seule occurrence :
# Réduire les espaces multiples en un seulecho "root : 0 : /root" | tr -s ' 'root : 0 : /root# Réduire les lignes vides dans un fichier (plusieurs \n consécutifs)tr -s '\n' < fichier-avec-lignes-vides.txtPratique pour normaliser la sortie de commandes comme df, ps ou netstat qui utilisent des espaces variables.
Utiliser les classes de caractères POSIX
Section intitulée « Utiliser les classes de caractères POSIX »tr accepte des classes POSIX entre [: et :] :
tr '[:upper:]' '[:lower:]' # équivalent A-Z → a-z, mais compatible avec les accentstr -d '[:space:]' # supprimer tous les espaces (espace, tab, newline...)tr -d '[:punct:]' # supprimer toute la ponctuationtr -d '[:digit:]' # supprimer les chiffresAttention à utiliser des guillemets simples autour des chaînes contenant !, # ou $ pour éviter l’interprétation par le shell :
echo 'abc123!@#' | tr -d '[:digit:]' # → abc!@#echo 'abc123!@#' | tr -d '[:punct:]' # → abc123Exemples d’administration
Section intitulée « Exemples d’administration »# 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 — fusionner des fichiers en colonnes
Section intitulée « paste — fusionner des fichiers en colonnes »paste est moins connu que cut et tr, mais très utile pour assembler plusieurs fichiers ou flux côte à côte.
Fusionner deux fichiers
Section intitulée « Fusionner deux fichiers »Imaginons deux fichiers :
alicebobcharlieadminuseruserpaste noms.txt roles.txtalice adminbob usercharlie userPar défaut, paste sépare les colonnes par une tabulation.
Changer le délimiteur avec -d
Section intitulée « Changer le délimiteur avec -d »paste -d',' noms.txt roles.txtalice,adminbob,usercharlie,userVous pouvez chaîner plusieurs délimiteurs différents pour assembler trois fichiers ou plus :
paste -d':,' noms.txt roles.txt uid.txtpaste alterne entre : et , à chaque champ.
Transformer des lignes en colonnes avec -s
Section intitulée « Transformer des lignes en colonnes avec -s »L’option -s (serial) fusionne toutes les lignes d’un fichier en une seule ligne :
paste -s noms.txtalice bob charlieC’est l’équivalent de tr '\n' '\t', mais avec un contrôle sur le délimiteur.
# Générer une liste inline pour une commandepaste -sd',' noms.txtalice,bob,charlieAssocier un numéro à chaque ligne
Section intitulée « Associer un numéro à chaque ligne »Combine paste avec la commande nl (ou cat -n) pour numéroter des lignes :
nl -ba noms.txt | paste -d' ' - roles.txtOu plus simplement :
paste <(nl -ba noms.txt) roles.txtAssembler la sortie de deux commandes
Section intitulée « Assembler la sortie de deux commandes »# Comparer les utilisateurs locaux avec leurs UIDspaste <(cut -d: -f1 /etc/passwd) <(cut -d: -f3 /etc/passwd)root 0daemon 1bob 1000Pipelines d’administration courants
Section intitulée « Pipelines d’administration courants »Extraire les IPs des connexions SSH actives
Section intitulée « Extraire les IPs des connexions SSH actives »ss -tn | grep ESTABLISHED | tr -s ' ' | cut -d' ' -f5 | cut -d: -f1 | sort -uss -tn: connexions TCP activestr -s ' ': normalise les espaces multiplescut -d' ' -f5: extrait la colonne adresse distantecut -d: -f1: enlève le portsort -u: déduplique
Créer un fichier CSV à partir de /etc/passwd
Section intitulée « Créer un fichier CSV à partir de /etc/passwd »cut -d: -f1,3,6 /etc/passwd | tr ':' ',' > utilisateurs.csvComparer deux listes et trouver les différences
Section intitulée « Comparer deux listes et trouver les différences »# Deux listes triées de paquets installés (avant/après)comm -13 <(sort avant.txt) <(sort apres.txt)Nettoyer un script généré sous Windows
Section intitulée « Nettoyer un script généré sous Windows »tr -d '\r' < script.sh > script-clean.shchmod +x script-clean.shGénérer une liste inline de services à démarrer
Section intitulée « Générer une liste inline de services à démarrer »cat services.txt | paste -sd' ' | xargs systemctl startDépannage
Section intitulée « Dépannage »| Problème | Cause probable | Solution |
|---|---|---|
cut retourne des champs vides | Délimiteur incorrect | Vérifier avec cat -A fichier — les tabulations s’affichent ^I |
cut --complement non reconnu | Système non-GNU (macOS, BSD) | Utiliser awk à la place |
tr : tr: extra operand | Trop d’arguments | tr ne prend que deux ensembles — vérifier la syntaxe |
tr : caractères non transformés | Locale différente | Utiliser les classes POSIX [:upper:] au lieu de A-Z |
paste : colonnes décalées | Fichiers avec un nombre de lignes différent | Vérifier avec wc -l — paste remplit avec des vides si inégal |
paste : tabulations non voulues | Délimiteur par défaut | Ajouter -d',' ou -d' ' pour choisir |
Rien ne s’affiche avec tr | Oubli du pipe ou de la redirection | tr lit stdin — utiliser `echo ”…“ |
À retenir
Section intitulée « À retenir »cutextrait des colonnes par position ou par délimiteur.-f4-sélectionne du champ 4 à la fin.--complementinverse la sélection (GNU uniquement).trtransforme caractère par caractère depuis stdin.-dsupprime,-sréduit les répétitions. Les classes POSIX ([:upper:],[:digit:]) sont plus portables que les plagesA-Z.pasteassemble des fichiers en colonnes.-dcontrôle le délimiteur,-sfusionne 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.