Extraction de caractères : cut
La commande cut sert à récupérer des caractères ou des champs d'une ligne.
Syntaxe
Couper par caractères
cut -c3 [fichiers ...] | Le 3ème caractère |
cut -c3-5 [fichiers ...] | Du 3ème au 5ème caractère |
cut -c-3 [fichiers ...] | Jusqu'au 3ème caractère |
cut -c3- [fichiers ...] | A partir du 3ème caractère |
cut -c3,10 [fichiers ...] | Le 3ème et le 10ème caractère |
Couper par champs
cut -dsep -f3 [fichiers ...] | Le 3ème champ |
cut -dsep -f3-5 [fichiers ...] | Du 3ème au 5ème champ |
cut -dsep -f-3 [fichiers ...] | Jusqu'au 3ème champ |
cut -dsep -f3- [fichiers ...] | A partir du 3ème champ |
cut -dsep -f3,10 [fichiers ...] | Le 3ème et le 10ème champ |
L'option -d permet d'exprimer le caractère séparateur de champ. Le caractère séparateur par défaut est la tabulation.
Exemples
Couper les 2 Premiers chiffres d'un code postal
$ echo 44150 | cut -c1-2
44
$
Afficher le 1er, 6ème et 7ème champs des 5 dernières lignes du fichier /etc/passwd
$ tail -5 /etc/passwd | cut -d: -f1,6,7
nobody:/nonexistent:/bin/sh
libuuid:/var/lib/libuuid:/bin/sh
postfix:/var/spool/postfix:/bin/false
sshd:/var/run/sshd:/usr/sbin/nologin
mysql:/var/lib/mysql:/bin/false
$
Si le caractère séparateur est un caractère spécial du shell, il faut le protéger.
$ ligne="val1|val2|val3"
$ echo $ligne | cut -d'|' -f1
val1
$
Commentaires
safa (non vérifié)
mer, 11/05/2016 - 11:41
Permalien
merci beaucoup
merci beaucoup
Jaal (non vérifié)
mer, 12/10/2016 - 15:36
Permalien
Aide sur une commande
J'aimerais Afficher dans chaque ligne les cinq premiers caracteres et les trois derniers caracteres de chaque ligne de mon fichier texte en les separant par un espace.
ronan
mer, 12/10/2016 - 16:19
Permalien
Bonjour,
Bonjour,
Pour ton problème, je te propose d'utiliser à la place de la commande cut, la commande sed.
Exemple:
$ sed -r 's/^(.{5}).*(.{3})$/\1 \2/' <fichier>
Explications:
La commande sed permet de modifier le contenu d'un fichier à l'aide de regex.
L'option -r permet d'utiliser les regex étendues.
La commande s/regexp/replacement/ substitue le contenu du fichier par replacement en utilisant la regex regexp.
Je te renvoie ici pour plus d'explications sur la commande sed.
remi (non vérifié)
jeu, 24/05/2018 - 12:13
Permalien
Bonjour
Bonjour,
Est-il possible de faire la même opération mais de sélectionner des colonnes et non des caractères?
merci
ronan
jeu, 24/05/2018 - 17:48
Permalien
Ca dépend
si tes champs sont de longueurs fixes ou avec un séparateur.
Par exemple, avec ce fichier (je pars du principe que j'ai 6 champs de longueurs fixes [5,10,10,1,3,10]):
$ cat file
Borne012345678901234567890AAA0123456789
Corne012345678901234567890AAA0123456789
Dorne012345678901234567890AAA0123456789
Borne012345678901234567890AAA0123456789
Eorne012345678901234567890AAA0123456789
Borne012345678901234567890AAA0123456789
Forne012345678901234567890AAA0123456789
Gorne012345678901234567890AAA0123456789
Horne012345678901234567890AAA0123456789
Iorne012345678901234567890AAA0123456789
Borne012345678901234567890AAA0123456789
Borne012345678901234567890AAA0123456789
Borne012345678901234567890AAA0123456789
Borne012345678901234567890AAA0123456789
Jorne012345678901234567890AAA0123456789
Je peux faire ceci:
ou alors avec un fichier ayant un séparateur de champ ";"
Beñat (non vérifié)
mer, 03/07/2019 - 11:41
Permalien
bémol
sed ne fonctionnera pas si plus de 9 champs à extraire ;-( any other solution ?
ronan
mer, 03/07/2019 - 23:04
Permalien
dans ce cas ...
un script Python fera très bien l'affaire.
BaTo (non vérifié)
ven, 17/02/2017 - 12:36
Permalien
Aide sur cut -c 2-$var
Bonjour,
J'ai besoin d'extraire une partie d'une variable à partir du 2ème caractères jusqu'à la fin de la variable.
Pour cela j'utilise, par exemple:
var=-136.5
var2=`echo $var | cut -c 2-${#var}`
echo $var2 donne: 136 5 donc pas de problème.
Mais lorsque je l'utilise dans un script, la variable "longueur" dans la commande cut n'est pas prise en compte:
cut: invalid byte, character or field list
Try `cut --help' for more information
Si le 2ème chiffre dans la commande est écrit en "dur", pas de problème dans le script, mais vu que mes variables n'ont pas toutes la même longueur, j'ai besoin d'utiliser la longueur de la variable dans la commande...mais là impossible...
Pouvez-vous m'aider?
Merci!
ronan
ven, 17/02/2017 - 15:12
Permalien
Bonjour,
Bonjour,
L'erreur que vous avez est bizarre car j'ai effectué un test de mon coté et ça fonctionne correctement.
Toujours est-il que comme indiqué à la quatrième ligne du tableau "Couper par caractères", dans le cas où l'on souhaite extraire tout le restant de la chaine, il n'est pas nécessaire d'indiquer une position de fin.
Cela réglera votre problème malgré que de mon coté ça fonctionne bien.
Voici le script que j'ai écrit pour le test
Voici le résultat
Dans le résultat de l'exécution, on voit bien que les deux cut ont fonctionné comme voulu.
Les deux variables C et D ont la même valeur.
Il peut s'agir d'une erreur toute bête dans votre script.
Pour le vérifier, pensez à activer le debug du script avec la commande "set -x".
C'est vraiment super pratique pour voir où il y a un bug.
BaTo (non vérifié)
ven, 17/02/2017 - 16:02
Permalien
Rectification
Bonjour,
Merci de votre réponse.
Effectivement sans renseigner la position de fin cela fonctionne très bien.
Je n'avais tout simplement pas d'erreur, car en console cela fonctionnait mais pas en script. Mes variables étant alimentées par résultat de requête SQL dans le script, il arrivait qu'un résultat soit null, dans ce cas la longueur de la variable est 0 et un cut -c 2-0 n'est bien évidemment pas accepté...
Excusez mon erreur!
Bien cordialement
ronan
ven, 17/02/2017 - 17:00
Permalien
You're welcome
.
celine (non vérifié)
mar, 29/06/2021 - 17:01
Permalien
bonjour, je souhaite vous
bonjour, je souhaite vous demander de l'aide svp je débute en shell
je vous remercie d'avnce
ronan
sam, 03/07/2021 - 08:47
Permalien
Bonjour Céline
Je pense que tout le contenu concernant Bash est assez bien documenté pour commencer
Ajouter un commentaire