Comment utiliser la commande cut en Linux pour extraire efficacement vos données

La commande cut en Linux est un outil fondamental pour tout administrateur système ou développeur. Oubliez la théorie, ce guide est une cheatsheet conçue pour une efficacité maximale. Elle permet de découper des lignes de texte en se basant sur des délimiteurs, des caractères ou des octets. Voici comment extraire précisément les données dont vous avez besoin, sans perdre une seconde, que ce soit depuis un fichier ou la sortie d’une autre commande.

Infographie cheat sheet : Commande cut en Linux : guide rapide pour extraire champs

Syntaxe Express & Cheatsheet : La commande cut en 30 secondes

L’objectif de cut est simple : extraire des portions de lignes. Sa syntaxe de base est directe : cut OPTION... [FICHIER].... Si aucun fichier n’est spécifié, la commande lit l’entrée standard, ce qui la rend parfaite pour être intégrée dans des pipelines avec le symbole |. Vous pouvez ainsi chaîner les commandes pour des traitements de données complexes à la volée.

Les trois modes d’extraction principaux sont mutuellement exclusifs : vous devez choisir entre les champs (-f), les caractères (-c) ou les octets (-b).

OptionDescriptionCas d’usage typique
-f, --fields=LISTSélectionne des champs (colonnes) spécifiques. Nécessite un délimiteur.Extraire la 1ère et 3ème colonne d’un fichier CSV.
-d, --delimiter=DELIMSpécifie le caractère délimiteur pour l’option -f. Le délimiteur par défaut est la tabulation.Utiliser la virgule (-d',') pour un CSV ou le deux-points (-d':') pour /etc/passwd.
-c, --characters=LISTSélectionne des caractères en fonction de leur position.Extraire les 10 premiers caractères d’une ligne dans un fichier à largeur fixe.
-b, --bytes=LISTSélectionne des octets (bytes) en fonction de leur position.Traitement de données binaires ou de fichiers avec un encodage simple (non-UTF-8).

La LIST de sélection est très flexible et suit une syntaxe commune :

  • N : Sélectionne uniquement le N-ième élément (champ, caractère, etc.).
  • N- : Sélectionne du N-ième élément jusqu’à la fin de la ligne.
  • N-M : Sélectionne une plage, du N-ième au M-ième élément inclus.
  • -M : Sélectionne du début de la ligne jusqu’au M-ième élément.
  • N,M : Sélectionne le N-ième et le M-ième élément.

Extraire par Colonnes : Le Duo Indispensable `-d` et `-f`

L’utilisation la plus courante de la commande cut en Linux repose sur le couple d’options -d (delimiter) et -f (field). C’est la méthode idéale pour manipuler des fichiers structurés comme les CSV ou les fichiers de configuration système.

L’exemple classique est l’extraction des noms d’utilisateurs du fichier /etc/passwd. Ce fichier utilise le caractère : comme délimiteur, et le nom d’utilisateur est le premier champ.

# Affiche le premier champ de chaque ligne du fichier /etc/passwd
cut -d':' -f1 /etc/passwd

De la même manière, pour un fichier CSV contenant des informations sur des produits (ID,Nom,Prix,Stock), on peut extraire le nom (2ème colonne) et le stock (4ème colonne) avec une seule commande.

# Fichier produits.csv :
# 101,Clavier,49.99,150
# 102,Souris,24.50,300

# Extrait la 2ème et la 4ème colonne
cut -d',' -f2,4 produits.csv

Attention, une limite importante : cut ne peut pas réorganiser les colonnes. Il les extrait et les affiche toujours dans l’ordre où elles apparaissent dans le fichier. Par exemple, si vous essayez d’afficher le shell (champ 7) avant le nom d’utilisateur (champ 1) de /etc/passwd, la sortie respectera l’ordre original.

# Tente d'afficher le champ 7 puis le champ 1
cut -d':' -f7,1 /etc/passwd

# Résultat (extrait) :
# root:/bin/bash
# daemon:/usr/sbin/nologin
# ...
# La sortie affiche toujours le champ 1 PUIS le champ 7.

La commande cut est un outil d’extraction, pas de réorganisation. Pour cela, des outils comme awk sont plus adaptés.

Découpe Chirurgicale : Maîtriser l’Extraction par Caractères avec `-c`

Lorsque les données ne sont pas séparées par un délimiteur mais alignées sur des positions fixes, l’option -c (characters) devient votre meilleure alliée. C’est le cas typique des rapports formatés ou des sorties de vieilles commandes système.

Un excellent exemple est la sortie de la commande ls -l. Si vous souhaitez extraire uniquement la section des permissions (qui occupe toujours les caractères 1 à 10), -c est parfait.

# Affiche les permissions, le type de fichier et les droits
ls -l | cut -c1-10

Comme pour les champs, vous pouvez spécifier des plages ou des listes de caractères. Voici quelques exemples pour illustrer la flexibilité de cette option :

# Extrait les 5 premiers caractères
echo "Bonjour le monde" | cut -c1-5
# Résultat: Bonjo

# Extrait le 1er, 3ème et 5ème caractère
echo "Bonjour le monde" | cut -c1,3,5
# Résultat: Bno

# Extrait à partir du 9ème caractère jusqu'à la fin
echo "Bonjour le monde" | cut -c9-
# Résultat: le monde

Il est important de noter la différence avec -b (bytes). Dans la plupart des cas avec du texte ASCII, les deux se comportent de manière identique. Cependant, avec des encodages comme l’UTF-8 où un caractère peut occuper plusieurs octets (bytes), utiliser -c est plus sûr. L’option -b pourrait couper un caractère multi-octets en deux, produisant une sortie corrompue.

Aller plus loin : Inverser la sélection et changer le délimiteur de sortie

La commande cut dispose de quelques options moins connues mais très pratiques pour des manipulations plus avancées. L’option --complement permet d’inverser la sélection : au lieu de garder ce que vous sélectionnez, vous gardez tout le reste.

C’est très utile pour exclure une colonne sensible. Par exemple, pour afficher toutes les informations de /etc/passwd sauf le nom d’utilisateur (le premier champ) :

# Affiche tous les champs SAUF le premier
cut -d':' -f1 --complement /etc/passwd

Une autre option puissante est --output-delimiter. Par défaut, cut utilise le même délimiteur en sortie qu’en entrée. Cette option vous permet de le changer, ce qui est parfait pour reformater des données. Par exemple, pour convertir un CSV délimité par des virgules en un fichier délimité par des points-virgules, en ne gardant que certains champs :

# Fichier data.csv (avant) :
# prenom,nom,ville
# Jean,Dupont,Paris

# Commande pour extraire le prénom et la ville et changer le délimiteur
cut -d',' -f1,3 --output-delimiter=';' data.csv

# Résultat (après) :
# prenom;ville
# Jean;Paris

Technicien découpe bandes colorées sur table lumineuse pour symboliser extraction de champs

Le Piège Mortel de `cut` et l’Astuce de Pro pour le Déjouer

Malgré sa puissance, cut a un talon d’Achille bien connu : sa gestion des espaces. C’est le piège dans lequel tombent de nombreux débutants et qui peut causer des heures de débogage frustrant sur des scripts.

Le Problème : Les Espaces Multiples
Lorsque vous utilisez cut -d' ', la commande traite chaque espace individuel comme un délimiteur. Si vos données contiennent plusieurs espaces consécutifs pour l’alignement visuel (comme dans la sortie de ps , ls -l ou netstat ), cut produira des champs vides entre chaque espace, rendant l’extraction de la « deuxième colonne » quasi impossible. À ce titre, netstat est souvent utilisé pour diagnostiquer les connexions réseau locales, et sa sortie nécessite un prétraitement adapté.

# La sortie contient des espaces multiples pour l'alignement
echo "champ1  champ2" | cut -d' ' -f2
# Résultat : (rien)
# cut considère le deuxième caractère comme un délimiteur, le troisième comme le champ 2 (vide), etc.

La Solution : Prétraiter ou Changer d’Outil
Heureusement, il existe des solutions simples.

  1. Compresser les espaces avec tr : La méthode la plus courante est de « piper » la sortie dans la commande tr -s ' ' avant de l’envoyer à cut. L’option -s (squeeze) de tr remplace les séquences d’espaces multiples par un seul espace.
    echo "champ1  champ2" | tr -s ' ' | cut -d' ' -f2
    # Résultat : champ2
  2. Utiliser awk : Pour des cas plus complexes, il est souvent plus simple de passer directement à awk. Cet outil gère nativement les espaces multiples comme un seul séparateur de champ.
    echo "champ1  champ2" | awk '{print $2}'
    # Résultat : champ2

Enfin, une astuce de pro consiste à utiliser cut dans un pipeline pour générer des statistiques rapides, une pratique courante en data crunching. Par exemple, pour trouver les 10 adresses IP qui ont le plus accédé à votre serveur web à partir d’un fichier de log Apache :

# Extrait la 1ère colonne (IP), trie, compte les occurrences, trie numériquement et affiche le top 10
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head -n 10

En résumé, la commande cut est l’outil parfait pour les extractions simples et rapides sur des données bien structurées. Pour toute logique plus complexe impliquant des conditions, des calculs ou une gestion avancée des délimiteurs, il est temps de se tourner vers des outils plus puissants comme awk ou sed. Maîtriser l’utilisation de cut en Linux reste une compétence essentielle pour manipuler efficacement les fichiers texte en ligne de commande.


Questions fréquentes

Pourquoi `cut` ne fonctionne pas correctement avec les espaces ?

Le problème vient du fait que cut -d' ' traite chaque espace comme un délimiteur distinct. Si vous avez plusieurs espaces consécutifs, cut verra des champs vides entre eux. La solution est de compresser les espaces en un seul avec tr -s ' ' avant de l’envoyer à cut, ou d’utiliser awk qui gère cela nativement.

Peut-on utiliser `cut` pour réorganiser l’ordre des colonnes en sortie ?

Non, c’est une limitation fondamentale de cut. Même si vous spécifiez les champs dans un ordre différent (ex: -f 3,1), la sortie sera toujours dans l’ordre d’apparition dans le fichier source (le champ 1 puis le champ 3). Pour réorganiser les colonnes, vous devez utiliser des outils plus flexibles comme awk.

Quelle est la différence majeure entre `cut -c` (caractères) et `cut -b` (bytes) ?

cut -b coupe en fonction du nombre d’octets (bytes), tandis que cut -c coupe en fonction du nombre de caractères. Pour du texte ASCII simple, ils sont équivalents. Cependant, pour des encodages comme l’UTF-8, où un caractère (ex: ‘é’) peut occuper plusieurs octets, -b risque de couper un caractère en deux et de corrompre la sortie. Il est donc plus sûr d’utiliser -c pour du texte.

Dans quel cas est-il préférable d’utiliser `awk` plutôt que `cut` ?

Il est préférable d’utiliser awk dès que la logique d’extraction devient complexe. Utilisez awk si vous avez besoin de : gérer des délimiteurs variables (comme des espaces multiples), réorganiser l’ordre des colonnes, effectuer des calculs sur les champs, ou appliquer des conditions (par exemple, n’afficher que les lignes où la troisième colonne est supérieure à 100). Ces capacités avancées rejoignent les techniques d’extraction et de transformation utilisées en data mining.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *