cut

Auteur: Ikipou

La commande "cut" permet d'extraire du contenu de chaque ligne d'un fichier et d'afficher ce contenu. Le verbe anglais "cut" signifie "couper", la commande permet effectivement de couper une partie de chaque ligne d'un fichier.

La sélection des caractères à afficher peut se faire de deux façons: par la position des caractères ou par la sélection de colonne en fonction d'un séparateur.

Sélection par position des caractères.

Les options -b et -c permettent de sélectionner des caractères selon leur position sur la ligne. La différence entre ces deux options est que -b (ou --bytes) utilise un mode binaire tandis que -c (ou --characters) utilise le mode caractère.

Pour sélectionner des caractères en fonction de leur position, il faut donc utiliser -b ou -c suivit d'une liste de positions à conserver. Le premier caractère de la ligne a la position 1.

Exemples

La commande "ps ax" affiche l'ensemble des processus du système, ainsi que des informations d'état sur ces processus:

$ ps ax
...
 5192 ?        S      0:00 hald-addon-keyboard: listening on /dev/input/event5
 5200 ?        S      0:00 hald-addon-storage: polling /dev/hda
 5219 ?        Ss     0:00 /usr/sbin/dhcdbd --system
 5234 ?        Ssl    0:00 /usr/sbin/NetworkManager --pid-file var/run/NetworkManager/NetworkManager.pid
...

On peut chaîner la commande cut à la commande ps afin de supprimer les premières colonnes et ne garder que la liste des processus:

$ ps ax | cut -c '28-'
...
hald-addon-keyboard: listening on /dev/input/event5
hald-addon-storage: polling /dev/hda
/usr/sbin/dhcdbd --system
/usr/sbin/NetworkManager --pid-file /var/run/NetworkManager/NetworkManager.pid
...

Le sélecteur "28-" permet de ne conserver que les caractères depuis la position 28 jusque la fin de la ligne.

Il est aussi possible de sélectionner plusieurs intervalles à conserver dans une ligne. Tout comme dans l'exemple de ps ax, cela permet de n'afficher que certaines informations d'une commande.

Par exemple, la commande ls -l affiche la liste des fichiers d'un dossier avec de nombreuses informations:

$ ls -l
total 20
drwxr-xr-x 2 root root   72 2007-05-11 15:32 if-down.d
drwxr-xr-x 2 root root   80 2007-04-26 23:02 if-post-down.d
drwxr-xr-x 2 root root   64 2007-04-26 23:02 if-pre-up.d
drwxr-xr-x 2 root root 4096 2007-05-11 15:32 if-up.d
-rw-r--r-- 1 root root  354 2007-05-20 22:43 interfaces

En chaînant la commande cut avec la commande ls il est possible d'obtenir facilement une liste des fichiers avec leurs droits:

$ ls -l | grep -Ev "^total [0-9]+$" | cut -c "1-11,46-"
drwxr-xr-x if-down.d
drwxr-xr-x if-post-down.d
drwxr-xr-x if-pre-up.d
drwxr-xr-x if-up.d
-rw-r--r-- interfaces

On peut voir ici dans l'utilisation de cut (cut -c "1-11,46-") qu'il est possible d'utiliser plusieurs intervalles, ceux-ci sont séparés par des virgules.

Sélection à l'aide de délimiteurs

La seconde possibilité pour sélectionner des caractères dans une ligne est d'utiliser des délimiteurs pour séparer la ligne en colonnes. Il est alors possible de choisir la ou les colonnes à afficher.

Le délimiteur par défaut est le caractère de tabulation ("\t") mais l'option "-d" (ou "--delimiter") permet de choisir un autre caractère.

L'option "-f" (ou "--fields") permet ensuite de sélectionner une liste de colonnes à affiche dans la ligne.

Exemples

Le fichier /etc/passwd contient la liste des utilisateurs ainsi que des informations sur le dossier de l'utilisateur, son shell, etc. Voici un exemple du contenu de ce fichier:

$ cat /etc/passwd
...
haldaemon:x:108:108:Hardware abstraction layer,,,:/var/run/hal:/bin/false
hplip:x:105:7:HPLIP system user,,,:/var/run/hplip:/bin/false
gdm:x:106:111:Gnome Display Manager:/var/lib/gdm:/bin/false
ikipou:x:1000:1000:Benjamin Poulain:/home/ikipou:/bin/bash
...

On voit que les informations sont séparées par des doubles points ":", on peut donc utiliser ce caractère comme délimiteur (avec -d) pour afficher une colonne quelconque.

Par exemple, la commande suivante affichera la liste des utilisateurs du système:

$ cut -d: -f1 /etc/passwd
...
haldaemon
hplip
gdm
ikipou
...

Pour avoir l'utilisateur et son numéro d'utilisateur (UID), on peut choisir d'afficher plusieurs colonnes:

$ cut -d: -f1,3 /etc/passwd
...
haldaemon:108
hplip:105
gdm:106
ikipou:1000
...

Syntaxe de liste

Les options -c, -b et -f peuvent prendre une liste d'intervalles comme paramètres, ces listes sont séparées par des virgules.

Les intervalles peuvent être exprimés de la façon suivante:

X
Sélectionner la position X, les positions commencent à 1
X-
Sélectionner depuis la position X jusque la fin de la ligne ou la dernière position
X-Y
Sélectionner de la position X à la position Y incluse
-Y
Sélectionner depuis la première position jusque la position Y

Il est préférable d'entourer un intervalle avec des guillemets ou des apostrophes afin qu'ils ne soient pas confondus avec des options.

Options importantes

-b
Sélectionner une série d'octet par rapport à leur position.
-c
Sélectionner une série de caractères par rapport à leur position.
-f
Sélectionner des colonnes séparées par un délimiteur.
-d
Permet de préciser le délimiteur à utiliser avec l'option -f

L'ensemble des options est disponible sur la page de manuel de cut

On passe sa vie à modifier ses définitions du bonheur et du malheur.
-+- Gilbert Cesbron (1913-1979), de petites choses. -+-