Comment utiliser la commande Linux cut
Le Linux cut
La commande vous permet d’extraire des portions de texte à partir de fichiers ou de flux de données. Il est particulièrement utile pour travailler avec des données délimitées, telles que des fichiers CSV. Voici ce que vous devez savoir.
Sommaire
La commande de coupe
le cut
command est un vétéran du monde Unix, faisant ses débuts en 1982 dans le cadre d’AT&T System III UNIX. Son but dans la vie est de couper des sections de texte à partir de fichiers ou de flux, selon les critères que vous avez définis. Sa syntaxe est aussi simple que son objectif, mais c’est cette simplicité conjointe qui le rend si utile.
A la manière traditionnelle d’UNIX, en combinant cut
avec d’autres utilitaires tels que grep
vous pouvez créer des solutions élégantes et puissantes à des problèmes complexes. Bien qu’il existe différentes versions de cut
, nous allons discuter de la version standard de GNU/Linux. Sachez que d’autres versions, notamment la cut
trouvées dans les variantes BSD, n’incluez pas toutes les options décrites ici.
Vous pouvez vérifier quelle version est installée sur votre ordinateur en exécutant cette commande :
cut --version
Si vous voyez « GNU coreutils » dans la sortie, vous êtes sur la version que nous allons décrire dans cet article. Toutes les versions de cut
ont certaines de ces fonctionnalités, mais la version Linux a été améliorée.
Premiers pas Avec coupe
Que nous acheminions des informations vers cut
ou en utilisant cut
pour lire un fichier, les commandes que nous utilisons sont les mêmes. Tout ce que vous pouvez faire pour un flux d’entrée avec cut
peut être fait sur une ligne de texte à partir d’un fichier, et vice versa. Nous pouvons dire cut
pour travailler avec des octets, des caractères ou des champs délimités.
Pour sélectionner un seul octet, nous utilisons le -b
(octet) option et dire cut
quel octet ou octets nous voulons. Dans ce cas, il s’agit de l’octet cinq. Nous envoyons la chaîne « how-to geek » dans le cut
commande avec un tube, « | », à partir de echo
.
echo 'how-to geek' | cut -b 5
Le cinquième octet de cette chaîne est « t », donc cut
répond en imprimant « t » dans la fenêtre du terminal.
Pour spécifier un intervalle nous utilisons un trait d’union. Pour extraire les octets 5 à 11 inclus, nous émettons cette commande :
echo 'how-to geek' | cut -b 5-11
Vous pouvez fournir plusieurs octets simples ou plages en les séparant par des virgules. Pour extraire l’octet 5 et l’octet 11, utilisez cette commande :
echo 'how-to geek' | cut -b 5,11
Pour obtenir la première lettre de chaque mot, nous pouvons utiliser cette commande :
echo 'how-to geek' | cut -b 1,5,8
Si vous utilisez le trait d’union sans première numéro, cut
renvoie tout depuis la position 1 jusqu’au nombre. Si vous utilisez le trait d’union sans seconde numéro, cut
renvoie tout depuis le premier nombre jusqu’à la fin du flux ou de la ligne.
echo 'how-to geek' | cut -b -6
echo 'how-to geek' | cut -b 8-
Utilisation de couper avec des caractères
Utilisant cut
avec des caractères est à peu près la même chose que de l’utiliser avec des octets. Dans les deux cas, une attention particulière doit être apportée aux caractères complexes. En utilisant le -c
(caractère) option, nous disons cut
travailler en termes de caractères, pas d’octets.
echo 'how-to geek' | cut -c 1,5,8
echo 'how-to geek' | cut -c 8-11
Ceux-ci fonctionnent exactement comme vous vous y attendiez. Mais regardez cet exemple. C’est un mot de six lettres, alors demandez cut
pour renvoyer les caractères de un à six, il faut renvoyer le mot entier. Mais ce n’est pas le cas. C’est un caractère court. Pour voir le mot entier, nous devons demander les caractères de un à sept.
echo 'piñata' | cut -c 1-6
echo 'piñata' | cut -c 1-7
Le problème est que le caractère « ñ » est en fait composé de deux octets. Nous pouvons voir cela assez facilement. Nous avons un court fichier texte contenant cette ligne de texte :
cat unicode.txt
Nous examinerons ce dossier avec le hexdump
utilitaire. En utilisant le -C
(canonique) nous donne un tableau de chiffres hexadécimaux avec l’équivalent ASCII à droite. Dans le tableau ASCII, le « ñ » n’est pas affiché, à la place, il y a des points représentant deux caractères non imprimables. Ce sont les octets mis en évidence dans le tableau hexadécimal.
hexdump -C unicode.txt
Ces deux octets sont utilisés par le programme d’affichage – dans ce cas, le shell Bash – pour identifier le « ñ ». De nombreux caractères Unicode utilisent trois octets ou plus pour représenter un seul caractère.
Si nous demandons le caractère 3 ou le caractère 4, le symbole d’un caractère non imprimable s’affiche. Si nous demandons les octets 3 et 4, le shell les interprète comme « ñ ».
echo 'piñata' | cut -c 3
echo 'piñata' | cut -c 4
echo 'piñata' | cut -c 3-4
Utilisation de couper avec des données délimitées
Nous pouvons demander cut
pour fractionner des lignes de texte à l’aide d’un délimiteur spécifié. Par défaut, cut utilise un caractère de tabulation mais il est facile de lui dire d’utiliser ce que nous voulons. Les champs du fichier « /etc/passwd » sont séparés par des deux-points « : », nous allons donc l’utiliser comme délimiteur et extraire du texte.
Les portions de texte entre les délimiteurs sont appelées des champset sont référencés comme des octets ou des caractères, mais ils sont précédés du -f
(champs). Vous pouvez laisser un espace entre le « f » et le chiffre, ou non.
La première commande utilise le -d
(délimiteur) pour indiquer à cut d’utiliser « : » comme délimiteur. Il va extraire le premier champ de chaque ligne du fichier « /etc/passwd ». Ce sera une longue liste donc nous utilisons head
avec le -n
(chiffre) pour afficher uniquement les cinq premières réponses. La deuxième commande fait la même chose mais utilise tail
pour nous montrer les cinq dernières réponses.
cut -d':' -f1 /etc/passwd | head -n 5
cut -d':' -f2 /etc/passwd | tail -n 5
Pour extraire une sélection de champs, répertoriez-les sous forme de liste séparée par des virgules. Cette commande extraira les champs un à trois, cinq et six.
cut -d':' -f1-3,5,6 /etc/passwd | tail -n 5
En incluant grep
dans la commande, nous pouvons rechercher des lignes qui incluent « /bin/bash ». Cela signifie que nous ne pouvons répertorier que les entrées qui ont Bash comme shell par défaut. Ce seront généralement les comptes d’utilisateurs « normaux ». Nous demanderons les champs de un à six car le septième champ est le champ shell par défaut et nous savons déjà ce que c’est – nous le recherchons.
grep "/bin/bash" /etc/passwd | cut -d':' -f1-6
Une autre façon d’inclure tous les champs sauf un est d’utiliser le --complement
option. Ceci inverse la sélection de champ et affiche tout ce qui n’a pas été demandé. Répétons la dernière commande mais ne demandons que le champ sept. Ensuite, nous exécuterons à nouveau cette commande avec le --complement
option.
grep "/bin/bash" /etc/passwd | cut -d':' -f7
grep "/bin/bash" /etc/passwd | cut -d':' -f7 --complement
La première commande trouve une liste d’entrées, mais le champ sept ne nous donne rien pour les distinguer, donc nous ne savons pas à qui les entrées se réfèrent. Dans la deuxième commande, en ajoutant le --complement
option nous obtenons tout sauf le champ sept.
Tuyauterie coupée En coupe
Restons fidèles au fichier « /etc/passwd », extrayons le champ cinq. Il s’agit du nom réel de l’utilisateur qui possède le compte d’utilisateur.
grep "/bin/bash" /etc/passwd | cut -d':' -f5
Le cinquième champ a des sous-champs séparés par des virgules. Ils sont rarement peuplés, ils apparaissent donc sous la forme d’une ligne de virgules.
Nous pouvons supprimer les virgules en redirigeant la sortie de la commande précédente vers une autre invocation de cut
. La deuxième instance de cut
utilise la virgule « , » comme délimiteur. le -s
(seulement délimité) l’option indique cut
pour supprimer les résultats qui ne contiennent pas du tout de délimiteur.
grep "/bin/bash" /etc/passwd | cut -d':' -s -f5 | cut -d',' -s -f1
Parce que l’entrée racine n’a pas de sous-champs virgule dans le cinquième champ, elle est supprimée, et nous obtenons les résultats que nous recherchons : une liste des noms des « vrais » utilisateurs configurés sur cet ordinateur.
EN RELATION: Comment fonctionnent les autorisations de fichiers Linux ?
Le délimiteur de sortie
Nous avons un petit fichier contenant des valeurs séparées par des virgules. Les champs de ces données factices sont :
- identifiant: Un numéro d’identification de base de données
- D’abord: Le prénom du sujet.
- Dernier: Le nom de famille du sujet.
- e-mail: Son adresse e-mail.
- Adresse IP: Son adresse IP.
- Marque: La marque du véhicule à moteur qu’ils conduisent.
- Modèle: Le modèle de véhicule à moteur qu’ils conduisent.
- An: L’année de construction de leur véhicule à moteur.
cat small.csv
Si nous disons à cut d’utiliser la virgule comme délimiteur, nous pouvons extraire les champs comme nous le faisions auparavant. Parfois, vous devrez extraire des données d’un fichier, mais vous ne souhaitez pas que le délimiteur de champ soit inclus dans les résultats. En utilisant le --output-delimiter
nous pouvons dire quel personnage – ou en fait, quel personnage séquence—à utiliser à la place du délimiteur réel.
cut -d ',' -f 2,3 small.csv
cut -d ',' -f 2,3 small.csv --output-delimiter=" "
La deuxième commande indique cut
pour remplacer les virgules par des espaces.
Nous pouvons aller plus loin et utiliser cette fonctionnalité pour convertir la sortie en une liste verticale. Cette commande utilise un caractère de nouvelle ligne comme délimiteur de sortie. Notez le « $ » que nous devons inclure pour que le caractère de nouvelle ligne soit utilisé et non interprété comme une séquence littérale de deux caractères.
Nous utiliserons grep
pour filtrer l’entrée de Morgana Renwick et demander cut
pour imprimer tous les champs du champ deux à la fin de l’enregistrement et pour utiliser un caractère de nouvelle ligne comme délimiteur de sortie.
grep 'renwick' small.csv | cut -d ',' -f2- --output-delimiter=$''
Un Oldie mais Goldie
Au moment d’écrire ces lignes, la petite commande de coupe approche de son 40e anniversaire, et nous l’utilisons toujours et écrivons à ce sujet aujourd’hui. Je suppose que couper du texte aujourd’hui est le même qu’il y a 40 ans. C’est beaucoup plus facile lorsque vous avez le bon outil à portée de main.
EN RELATION: 37 commandes Linux importantes à connaître