Astuce shell : masquer la première ligne d'un résultat

Dans les scripts shell, j'ai parfois besoin d'afficher toutes les lignes d'un résultat sauf la première. L'exemple typique est une liste de noms, d'adresses, etc, qui contient une ligne d'en-tête dont on n'a pas besoin.
Mise à jour : on ne connaît pas à l'avance le nombre de lignes à traiter, celui-ci peut être variable.

$ cat liste.txt
Liste d'utilisateurs #ligne à supprimer
user1
user2
user3
$

En utilisant la commande head avec un nombre de lignes négatif, on affichera tout sauf n lignes. Pour ne pas afficher la dernière ligne, on peut donc utiliser la commande suivante :

$ head -n -1 liste.txt
Liste d'utilisateurs #ligne à supprimer
user1
user2
$

On pourrait croire qu'utiliser la commande tail de la même manière permettrait de ne pas afficher la première ligne. Erreur, tail ne prend pas en compte les nombres négatifs et pensera qu'on lui demande d'afficher seulement la dernière ligne :

$ tail -n -1 liste.txt
user3
$

La solution à ce problème est simple, mais pas évidente au premier abord. Le sauveur est la commande tac, qui inverse l'ordre des lignes (l'inverse de cat).

Voici la commande qui vous permettra d'afficher toutes les lignes sauf la première :

$ tac liste.txt | head -n -1 | tac
user1
user2
user3
$

En effet, avec tac, la première ligne devient la dernière, et on sait qu'on peut supprimer la dernière ligne avec head. Il ne reste plus qu'à utiliser tac une seconde fois pour remettre les lignes dans l'ordre.

Mise à jour : On m'a signalé une solution beaucoup plus simple qui utilise la commande sed, à laquelle je n'avais pas pensé de prime abord. Tout simplement :

$ sed '1d' liste.txt

Dans sed, la commande d va supprimer l'affichage des lignes sélectionnées. En entrant 1d, on lui indique qu'on veut supprimer la première ligne. De la même manière, en entrant 2,5d on lui indique de supprimer les lignes 2 à 5. Enfin, avec $d, on lui indique de supprimer la dernière ligne.

Vus : 8433
Publié par Linalis : 17