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 »cut découpe chaque ligne et n'en garde que la portion demandée. Il fonctionne selon deux modes exclusifs : par champ (-f), avec un délimiteur d'un seul caractère fixé par -d, ou par position de caractère (-c). Le délimiteur par défaut est la tabulation, ce qui explique la plupart des sorties vides observées sur un fichier séparé par des deux-points ou des virgules.
Rappel de la syntaxe de base
Section intitulée « Rappel de la syntaxe de base »Ces deux formes couvrent l'essentiel des usages, l'une par champ, l'autre par position.
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 »Avec -d, tr n'attend plus qu'un seul ensemble : tout caractère qui en fait partie disparaît du flux, les autres passent inchangés.
# 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 »Trois cas récurrents illustrent les usages réels de tr : normaliser un séparateur, extraire un segment d'URL dans un log Apache, et remettre une liste verticale sur une seule ligne pour la passer à une commande. Notez la redirection < export.csv du premier exemple : tr ne prend jamais de nom de fichier en argument.
# 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 »L'option remplace la tabulation par le caractère de votre choix, ce qui suffit à produire directement du CSV.
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 »En combinant paste avec deux substitutions de processus, vous assemblez côte à côte le résultat de deux commandes sans écrire le moindre fichier intermédiaire.
# 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 »Les cinq enchaînements ci-dessous reprennent des besoins réels d'exploitation. Ils suivent tous la même progression : une commande produit une sortie trop large, tr la normalise, cut en extrait la colonne utile, et un dernier filtre trie ou déduplique. Testez toujours un pipeline étape par étape, en retirant le dernier maillon, avant de le figer dans un script.
Extraire les IPs des connexions SSH actives
Section intitulée « Extraire les IPs des connexions SSH actives »Ce pipeline suppose une sortie ss dont les colonnes sont séparées par un nombre variable d'espaces, d'où le passage obligé par tr -s.
ss -Htn state established | tr -s ' ' | cut -d' ' -f4 | cut -d: -f1 | sort -uss -Htn state established: connexions TCP établies, sans ligne d'en-tête (-H), sinon le motAddressse retrouve dans les résultats. Attention,ssabrège l'état enESTAB: ungrep ESTABLISHEDne renverrait jamais rien. Le filtre natifstate establishedest plus sûr qu'un grep.tr -s ' ': normalise les espaces multiplescut -d' ' -f4: extrait la colonne adresse distante. Le filtrestatesupprime la colonne d'état de la sortie, l'adresse distante devient donc le quatrième champ, pas le cinquième.cut -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 »Les champs retenus sont le nom de connexion, l'UID et le répertoire personnel ; tr convertit ensuite le séparateur historique : en virgule.
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 »comm exige deux entrées triées, d'où les sort dans les substitutions. Les options -13 masquent les colonnes 1 et 3, ne laissant que les lignes présentes uniquement dans le second fichier, autrement dit les paquets ajoutés.
# 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 »Un \r en fin de shebang provoque l'erreur bad interpreter, faute que rien ne rend visible à l'affichage. La redirection écrit un nouveau fichier : le script d'origine reste intact, et les droits d'exécution sont à reposer sur la copie.
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 »paste -sd' ' met les noms de services sur une seule ligne, que xargs transmet ensuite comme arguments à systemctl. Vérifiez le contenu avec un echo avant de lancer réellement la commande : xargs n'attend aucune confirmation.
cat services.txt | paste -sd' ' | xargs systemctl startDépannage
Section intitulée « Dépannage »La grande majorité des surprises avec ces trois outils tient à des caractères invisibles à l'écran : tabulation prise pour un espace, \r en fin de ligne, espaces multiples entre colonnes. Le premier réflexe est donc cat -A fichier, qui rend ces caractères visibles. Les lignes ci-dessous couvrent les sept symptômes les plus fréquents.
| 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 "..." | tr ... ou tr ... < fichier |
Mettre en pratique
Section intitulée « Mettre en pratique »Transformer un fichier brut en faits exacts est le quotidien du scripting d'administration. Ce lab vous fait découper des colonnes, dédupliquer des lignes, compter les occurrences, sommer un champ et réécrire un délimiteur avec cut, sort, uniq, sed et awk. Votre sortie est comparée au résultat attendu, à la ligne près.
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À 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.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Comparer des fichiers avec diff : Identifier les différences entre deux fichiers de configuration ou deux versions d'un script.
- Référence cut : Toutes les options cut : champs, caractères, octets, --complement, le condensé pour extraire des colonnes.
- Référence awk : Aller plus loin quand cut atteint ses limites : séparateurs variables, conditions, calculs.