Linux / Commande cut : extraire des champs, caractères et octets
cut extrait de chaque ligne les champs, les caractères ou les octets que vous sélectionnez. Pour des champs, utilisez -f et, si le séparateur n'est pas une tabulation, ajoutez -d. Cet outil convient aux données simples à structure régulière ; il ne sait pas interpréter les guillemets et les champs multilignes d'un CSV complet.
Les positions commencent à 1. La commande affiche le résultat sans modifier le fichier lu. Le choix entre un champ, un caractère et un octet est essentiel : un caractère UTF-8 peut occuper plusieurs octets, et le comportement disponible dépend aussi de la version de cut.
Syntaxe et préparation d'un exemple complet
cut -d 'séparateur' -f liste [fichiers…]
cut -c liste [fichiers…]
cut -b liste [fichiers…]
Choisissez un mode de sélection : champs, caractères ou octets. Sans fichier, cut lit son entrée standard. Voici un répertoire d'exercice Bash avec des données fictives, pour ne pas dépendre de vos comptes système :
cut_lab=$(mktemp -d "$HOME/cut-lab.XXXXXX")
cd -- "$cut_lab"
printf 'alpha:100:/bin/bash\nbeta:200:/bin/sh\n' > accounts.txt
printf 'abcdefghij\n1234567890\n' > sample.txt
mktemp -d crée un nouveau répertoire ; notez son chemin pour retrouver les fichiers. Pour quitter l'exercice sans modifier d'autres documents, utilisez ensuite cd "$HOME". Consultez man cut pour le manuel installé et, avec GNU cut, cut --version pour connaître la version.
Extraire un ou plusieurs champs
Le fichier accounts.txt contient trois champs séparés par des deux-points. Pour extraire le premier :
cut -d ':' -f 1 accounts.txt
alpha
beta
Pour sélectionner le nom et le shell fictif, choisissez les champs 1 et 3 :
cut -d ':' -f 1,3 accounts.txt
alpha:/bin/bash
beta:/bin/sh
La sortie suit toujours l'ordre des champs dans l'entrée. -f 3,1 donne donc aussi le champ 1 avant le champ 3 ; cut n'est pas un outil de réorganisation de colonnes. Les sélections peuvent être des positions, des plages comme 1-3, ou une plage ouverte comme 2-.
Sur un système Linux classique, les mêmes principes permettent d'examiner les noms et les shells du fichier local des comptes :
cut -d ':' -f 1 /etc/passwd
cut -d ':' -f 1,7 /etc/passwd
Le résultat dépend des comptes présents sur votre machine ; il ne doit pas ressembler nécessairement aux noms fictifs ci-dessus. Ces commandes lisent le fichier local et ne constituent pas une liste complète de tous les comptes fournis par un annuaire distant.
Choisir le séparateur et traiter les lignes atypiques
La tabulation est le séparateur par défaut du mode -f. Dans l'exemple suivant, printf produit de vraies tabulations avec \t :
printf 'alpha\t100\nbeta\t200\n' | cut -f 2
100
200
Pour un autre caractère, indiquez -d. L'exemple minimal suivant ne crée pas de fichier :
printf 'alpha:100\nbeta:200\n' | cut -d ':' -f 1
Il affiche alpha, puis beta. Attention aux lignes sans séparateur : elles sont conservées en entier par défaut, même si vous demandez le deuxième champ.
printf 'alpha:100\nsans-separateur\n' | cut -d ':' -f 2
printf 'alpha:100\nsans-separateur\n' | cut -s -d ':' -f 2
La première commande affiche 100 puis sans-separateur. La seconde affiche seulement 100. L'option -s écarte les lignes qui ne contiennent pas le séparateur ; elle ne valide pas pour autant le nombre de champs ou le format des autres lignes.
Sélectionner des positions et vérifier l'encodage
Sur les deux lignes ASCII de sample.txt, la sélection des huit premières positions donne un résultat facile à observer :
cut -c 1-8 sample.txt
abcdefgh
12345678
-b sélectionne des octets. Avec ce jeu de caractères ASCII, remplacer -c par -b produit le même résultat. Cette équivalence ne permet pas de conclure que les deux options sont interchangeables pour du français accentué ou d'autres caractères multioctets.
Le manuel GNU Coreutils 9.12 décrit une sélection par caractères avec -c et considère les caractères combinatoires séparément. Des versions plus anciennes, notamment GNU cut 8.32, traitent encore -c comme une sélection par octets. Vérifiez donc votre version, sa documentation et la locale avant de découper un texte UTF-8. Même une sélection par caractères n'est pas nécessairement une sélection par symbole visuel complet, lorsqu'un symbole combine plusieurs caractères.
Pour un traitement destiné à conserver des caractères Unicode, choisissez un outil dont le comportement correspond explicitement à l'encodage de vos données. Ne découpez pas arbitrairement un flux UTF-8 avec -b si le résultat doit rester un texte valide.
Reconnaître les limites avec les espaces et le CSV
Un espace défini par -d ' ' est un séparateur littéral. Deux espaces successifs peuvent créer un champ vide. Comparez ces deux commandes sur une entrée identique :
printf 'alpha 100\n' | cut -d ' ' -f 2
printf 'alpha 100\n' | awk '{print $2}'
La première produit une ligne vide : entre les deux espaces se trouve le deuxième champ. La seconde affiche 100, car awk regroupe par défaut les suites de blancs pour séparer les champs. Pour des colonnes à espacement variable et une bonne portabilité, awk est souvent plus approprié. Des versions GNU récentes proposent aussi des modes de séparation par blancs, mais ils ne sont pas disponibles dans toutes les versions installées.
Avec des données comme "Paris, France",100, cut -d ',' voit la virgule à l'intérieur des guillemets comme un séparateur ordinaire. Pour un CSV qui admet des guillemets, des séparateurs dans un champ ou des retours à la ligne intégrés, utilisez un analyseur CSV dédié. Ajouter des guillemets à l'argument du shell ne donne pas à cut la connaissance du format CSV.
Options et sauvegarde de l'extraction
| Option | Rôle |
|---|---|
-f liste |
Choisir des champs, numérotés à partir de 1. |
-d caractère |
Remplacer la tabulation comme séparateur du mode champs. |
-c liste |
Choisir des positions de caractères, en vérifiant le comportement de la version et l'encodage. |
-b liste |
Choisir des positions d'octets. |
-s |
En mode champs, écarter les lignes dépourvues de séparateur. |
Enregistrez le résultat sous un nouveau nom, puis comparez-le à la source :
cut -d ':' -f 1 accounts.txt > account-names.txt
cat account-names.txt
cat accounts.txt
L'extraction contient deux noms ; la source contient encore les trois champs de chaque compte fictif. Choisissez une destination qui ne contient pas déjà de données à conserver. Ne redirigez pas vers le fichier d'entrée lui-même, car le shell peut le vider avant sa lecture.
Le manuel officiel de GNU cut décrit les plages, l'ordre de sortie et les options des versions actuelles. Pour un script déployé sur plusieurs machines, appuyez-vous aussi sur le manuel de la version effectivement installée.




