Comment utiliser les tests conditionnels à double crochet sous Linux
Agence web » Actualités du digital » Comment utiliser la commande Linux cut

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.

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

Extraire un seul octet avec cut

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

Extraire une plage d'octets avec cut

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

Extraire deux octets avec cut

Pour obtenir la première lettre de chaque mot, nous pouvons utiliser cette commande :

echo 'how-to geek' | cut -b 1,5,8

Extraction de trois octets avec coupe

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-

Extraction de plages d'octets avec coupe

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

Extraction de caractères et plages de caractères avec coupure

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

Les caractères spéciaux peuvent prendre plus d'un caractère

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

Le contenu du fichier texte court

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

Hexdump du fichier texte de test

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 cut pour extraire les caractères qui composent un caractère spécial

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

Extraire une plage de champs du fichier /etc/passwd

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

Extraire une plage de champs du fichier /etc/passwd

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

Extraction des champs un à six du fichier /etc/passwd

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

Utilisation de l'option --complement pour inverser une sélection de champs

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 du fichier /etc/passwd peut avoir des sous-champs séparés par des virgules

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

Tuyauterie coupée en coupe pour faire face à deux types de délimiteur

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

Un fichier texte de données CSV factices

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=" "

Utiliser --output-delimiter pour changer le délimiteur dans les résultats

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=$''

Conversion d'un enregistrement en liste en utilisant un caractère de saut de ligne comme délimiteur de sortie

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

★★★★★