Linux / Commande head : afficher les premières lignes ou les premiers octets

head affiche le début d'un fichier ou de l'entrée standard, avec les dix premières lignes par défaut. Utilisez -n pour choisir un nombre de lignes et -c pour choisir un nombre d'octets. Cette lecture ne modifie pas le fichier et convient pour examiner un en-tête ou un échantillon avant de traiter l'ensemble des données.

Les options GNU présentées ici suivent le manuel officiel de GNU head. Vérifiez head --help sur votre système, notamment avant d'utiliser un nombre négatif ou un suffixe de taille.

Choisir les premières lignes d'un fichier ou d'un flux

La syntaxe est head [OPTION]... [FICHIER...]. Sans fichier, ou avec le nom -, la commande lit l'entrée standard. Pour un fichier dont le nom commence par un tiret, séparez les options du nom avec --.

Ce premier exemple se suffit à lui-même et ne crée aucun fichier :

printf 'un\ndeux\ntrois\n' | head -n 2

Le résultat attendu est :

un
deux

Pour appliquer la même lecture à un fichier réel, remplacez le chemin ci-dessous par un fichier texte accessible. L'exemple affiche six lignes physiques, sans interpréter le format CSV :

head -n 6 -- ventes.csv

Si le fichier contient un en-tête puis une ligne par enregistrement, vous verrez l'en-tête et cinq enregistrements. Toutefois, un champ CSV entre guillemets peut contenir un retour à la ligne : six lignes physiques ne correspondent alors pas forcément à six enregistrements CSV. Si le fichier a moins de six lignes, head affiche simplement ce qui est disponible.

Comparer lignes et octets avec un exercice reproductible

Créez un nouveau dossier de pratique dans votre répertoire personnel et un fichier ASCII de trois lignes. Gardez la variable lab dans le même shell pour les exemples suivants :

lab=$(mktemp -d "$HOME/head-lab.XXXXXX") || exit 1
printf 'alpha\nbeta\ngamma\n' > "$lab/exemple.txt"
head -n 2 -- "$lab/exemple.txt"
head -c 5 -- "$lab/exemple.txt"
printf '\n'

Le premier appel affiche alpha puis beta sur deux lignes. Le second affiche seulement les cinq octets alpha, sans le retour à la ligne qui suit dans le fichier ; le dernier printf remet donc le terminal sur une nouvelle ligne.

Un octet n'est pas un caractère. En UTF-8, une lettre accentuée ou un autre symbole peut occuper plusieurs octets ; head -c peut couper au milieu de ce codage et produire une fin illisible. Pour examiner un fichier binaire, évitez d'envoyer arbitrairement ses octets de contrôle au terminal ; utilisez un outil d'affichage hexadécimal adapté si vous devez interpréter son contenu.

Distinguer les sorties de plusieurs fichiers

Avec plusieurs fichiers, GNU head affiche normalement un en-tête portant leur nom pour chaque portion. -v impose cet en-tête même pour un seul fichier ; -q le supprime dans tous les cas.

printf 'rouge\nbleu\n' > "$lab/autre.txt"
head -v -n 1 -- "$lab/exemple.txt" "$lab/autre.txt"
head -q -n 1 -- "$lab/exemple.txt" "$lab/autre.txt"

Le premier appel associe chaque nom à sa première ligne : alpha pour exemple.txt et rouge pour autre.txt. Le second n'affiche que ces deux valeurs, sans nom de fichier. Gardez les en-têtes pour une lecture humaine où la provenance compte ; supprimez-les si un traitement attend uniquement les données et si l'ordre des fichiers est connu.

Utiliser les extensions GNU en vérifiant leur sens

Option Effet Limite
-n N Affiche les premières N lignes. Ne trie pas les données et n'interprète pas leurs enregistrements.
-c N Affiche les premiers N octets. Peut couper un caractère multioctet.
-q Supprime les en-têtes de fichier. La provenance n'est plus indiquée dans la sortie.
-v Affiche toujours les en-têtes. Ajoute des lignes qui ne font pas partie du fichier.
-n -N Dans GNU head, affiche tout sauf les N dernières lignes. Ce n'est pas « prendre les premières N lignes » ; vérifier la variante installée.
-c -N Dans GNU head, affiche tout sauf les N derniers octets. Ne respecte pas nécessairement les frontières de caractères.

Avec le fichier de pratique, head -n -1 "$lab/exemple.txt" affiche alpha et beta en excluant gamma. Revenez à head -n 1 pour afficher seulement la première ligne. Les suffixes GNU distinguent aussi 1K, soit 1 024 octets, de 1KB, soit 1 000 octets ; indiquez une quantité explicite quand cette différence compte.

Comprendre la fin anticipée d'un pipeline

head ferme son entrée après la portion demandée. Si la commande placée avant lui continue à écrire, elle peut recevoir le signal SIGPIPE, qui indique une écriture dans un tube fermé. Cela peut être un effet attendu de la limitation, mais un script doit examiner les états concernés avant de classer tout le traitement comme réussi ou échoué.

Par exemple, une commande de recherche peut produire bien plus de vingt chemins que ce que vous souhaitez lire :

find "$lab" -type f -print | head -n 20

Ce pipeline affiche au plus vingt lignes dans l'ordre produit par find. Il ne donne ni les vingt fichiers les plus récents ni les vingt plus gros. Pour ces questions, il faut choisir les métadonnées et l'ordre de tri appropriés avant de limiter la sortie. Un nom de fichier contenant un retour à la ligne peut aussi occuper plusieurs lignes ; ce pipeline sert à une lecture rapide, pas à transmettre sans ambiguïté des noms à une commande qui les modifierait.

Dans Bash, set -o pipefail peut faire remonter l'échec d'un producteur interrompu alors que head a obtenu sa portion. Consultez immédiatement PIPESTATUS si vous diagnostiquez chaque maillon ; une commande supplémentaire remplace ces états. Le petit exemple de trois lignes au début ne garantit pas un SIGPIPE, car le producteur peut avoir fini avant la fermeture.

Choisir head, tail ou un lecteur interactif

head convient à un en-tête ou à un échantillon initial. La commande tail sert à la fin d'un fichier et à certains suivis de journaux. less permet une navigation interactive ; sed convient à une sélection de lignes plus précise. Les noms et options peuvent varier selon l'implémentation, donc préférez -n 5 à l'ancienne écriture -5 dans vos scripts.

Questions fréquentes

head modifie-t-il le fichier original ?

Non. Il lit l'entrée et écrit la portion choisie sur sa sortie standard. Une redirection ajoutée par le shell peut toutefois écraser un fichier cible : ne redirigez pas la sortie vers le fichier en cours de lecture.

Pourquoi les premières lignes ne sont-elles pas les événements les plus récents ?

head conserve l'ordre de l'entrée. Dans un journal auquel on ajoute à la fin, les événements récents se trouvent généralement du côté lu par tail.

La référence des commandes Linux par tâche regroupe les commandes de lecture et de traitement de texte.