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
Frédéric (non vérifié)
ven, 31/03/2023 - 14:16
Permalien
Decoupage de log
J'aimerais dans un log recuperer tout les segments compris entre 2 mots précis. Est ce possible ?
ronan
ven, 31/03/2023 - 22:46
Permalien
Découpage de log
Bonjour Frédéric
Aurais tu un exemple à fournir ?
Anonyme (non vérifié)
lun, 03/04/2023 - 15:11
Permalien
Oui voici un exemple :
Oui voici un exemple :
Emetteur
Entrée A
Entrée B
Dossier modifie
Emetteur
Entrée C
Entrée D
Dossier inconnu
Emetteur
Entrée A
Entrée C
Dossier modifie
Emetteur
Entrée B
Entrée X
Dossier inconnu
Voilà, ce que je souhaiterais, c'est ne garder que les dossiers inconnus :
Emetteur
Entrée C
Entrée D
Dossier inconnu
Emetteur
Entrée B
Entrée X
Dossier inconnu
Le problème étant que faire un cat Fichier.log | awk '/Emetteur/,/Dossier inconnu/' > DossierInconnu.log ne suffit pas, car il me prend trop de chose.
ronan
lun, 03/04/2023 - 21:36
Permalien
Une idée comme une autre
$ tac Fichier.log | sed -n '/Dossier inconnu/,/Emetteur/p' | tac
Emetteur
Entrée C
Entrée D
Dossier inconnu
Emetteur
Entrée B
Entrée X
Dossier inconnu
Anonyme (non vérifié)
mar, 04/04/2023 - 16:03
Permalien
Merci Ronan,
Merci Ronan,
J'ai réussi a le faire avec awk au final, je partage l'info au cas ou ça intéresse du monde ici :
awk '/^Emetteur/{n=1} {lines[n++]=$0} /^Dossier inconnu/{for(i=1;i<n;++i) print lines[i]}' Event.log
juste pour info, le "|tac" a la fin de ton sed sert a faire quoi s'il te plait ?
ronan
mar, 04/04/2023 - 22:39
Permalien
You're welcome
J'ai pas eu le temps de tester ta solution.
Pour ce qui est de la mienne, le premier "tac" permet d'inverser le contenu du fichier, de cette façon, il est plus simple de trouver en premier "Dossier inconnu" étant donné que tous les blocs d'information commencent tous par "Emetteur" et enfin, pour finir, le deuxième et dernier "tac" permet de remettre dans le bon ordre les éléments trouvés.
Anonyme (non vérifié)
mer, 05/04/2023 - 08:41
Permalien
Merci Ronan !
Merci Ronan !
Ajouter un commentaire