Comando head in Linux: leggere le prime righe o i primi byte di un file
head stampa la parte iniziale di un file o dello standard input, cioè il flusso ricevuto da un altro comando. Per impostazione predefinita mostra fino alle prime dieci righe di ciascun input: è utile per controllare un’intestazione o un piccolo campione senza modificare il file.
Gli esempi usano GNU Coreutils, normalmente disponibile su Linux. Per creare i file dimostrativi prepara una cartella nuova con mkdir head-demo && cd head-demo e prosegui soltanto se entrambi i comandi riescono; scegli nomi nuovi per evitare di sovrascrivere documenti da conservare. Le preparazioni richiedono una shell compatibile, printf e seq.
Usa -n per contare le righe e -c per contare i byte. Con più file, un’intestazione identifica normalmente ciascun risultato. GNU head accetta anche conteggi negativi per escludere le ultime righe o gli ultimi byte: non significano “leggere dalla fine”.
Sintassi di base
head [OPTION]... [FILE]...
OPTION e FILE sono segnaposto. Controlla head --version, head --help e man head sul sistema di destinazione: opzioni GNU, conteggi negativi e suffissi non sono identici in tutte le implementazioni. Senza file, oppure con l’operando esatto -, legge lo standard input. Racchiudi tra virgolette i nomi con spazi e usa, per esempio, head -- ./-events.log per un nome che inizia con un trattino.
Uso di base di head
Mostrare le prime dieci righe
Crea access.log con seq 1 30 > access.log. Il comando seguente mostra i numeri da 1 a 10, uno per riga. Se il file contiene meno di dieci righe, stampa solo quelle disponibili: non aggiunge righe vuote per raggiungere il numero richiesto.
head access.log
Scegliere quante righe stampare
Con lo stesso access.log, -n 25 mostra i numeri da 1 a 25. head -n 1 access.log restituisce soltanto la prima riga; head -n 0 access.log non ne stampa nessuna. La selezione mantiene l’ordine originario e non cambia il contenuto del file.
head -n 25 access.log
Scegliere un numero di byte
Il conteggio riguarda i byte, non i caratteri Unicode. Per una prova innocua crea un file di 128 caratteri ASCII con printf '%0128d' 0 > sample.bin: il comando seguente ne stampa 64, senza nuova riga finale. Con un vero file binario evita di inviare byte sconosciuti direttamente al terminale: controlla il risultato come esadecimale, per esempio con head -c 64 sample.bin | od -An -tx1. L’estensione .bin non determina da sola il tipo di contenuto.
head -c 64 sample.bin
Verificare il risultato su uno standard input
La pipe | passa tre righe da printf a head. Con -n 2 rimangono soltanto one e two, ciascuna terminata da nuova riga. L’output seguente è completo per questo piccolo esempio; non vengono creati file di input.
printf 'one\ntwo\nthree\n' | head -n 2
Esempio di output:
one
two
Head può chiudere la lettura quando ha ottenuto il campione richiesto. Un produttore che sta ancora scrivendo può quindi ricevere SIGPIPE, il segnale di una pipe che non ha più lettori, oppure un errore di scrittura. Non è garantito per ogni input: dipende anche da quantità di dati e buffer. Un risultato visibile corretto non dimostra da solo che tutti i comandi della pipeline siano terminati con successo.
Opzioni principali di GNU head
| Opzione | Scopo |
|---|---|
-n NUM |
Stampa fino alle prime NUM righe di ciascun input; se sono meno, stampa quelle presenti. |
-c NUM |
Stampa fino ai primi NUM byte, senza rispettare i confini dei caratteri multibyte. |
-q |
Non mostra le intestazioni con i nomi dei file, anche con più input. |
-v |
Mostra le intestazioni con i nomi dei file, anche con un solo input. |
-n -NUM |
Estensione GNU: stampa tutto tranne le ultime NUM righe di ciascun input. |
-c -NUM |
Estensione GNU: stampa tutto tranne gli ultimi NUM byte di ciascun input. |
Esempi pratici
Controllare l’intestazione di un CSV e alcune righe
Crea sales.csv con printf 'prodotto,quantita\npenna,2\nlibro,1\nquaderno,3\ngomma,4\nmatita,5\nrighello,1\n' > sales.csv. Il comando seguente mostra l’intestazione e le prime cinque righe di dati, escludendo righello. CSV significa Comma-Separated Values, valori separati da virgole: head conta comunque nuove righe, non record CSV. Se un campo tra virgolette contiene una nuova riga, il campione può interrompere un record; per contare o validare record usa uno strumento che interpreti il formato.
head -n 6 sales.csv
Confrontare l’inizio di più log
Crea app.log con printf 'avvio\nrichiesta\nfine\n' > app.log e worker.log con printf 'inizio lavoro\nlavoro completato\n' > worker.log. Il comando seguente mostra prima l’intestazione ==> app.log <== e le sue tre righe, poi quella di worker.log e le sue due righe. Non stampa cinque righe inesistenti per ogni file. -v forza le intestazioni anche con un solo file; head -q -n 1 app.log worker.log le elimina e stampa avvio e inizio lavoro senza etichette.
head -v -n 5 app.log worker.log
Limitare la parte visibile dell’output di un comando
Nell’esempio find cerca i file normali sotto /var/log e head mostra fino alle prime 20 righe di output. L’ordine di find non garantisce né ordinamento alfabetico né data più recente; gli errori di accesso restano sullo standard error e non vengono limitati dalla pipe. Per una prova locale crea mkdir logs-demo e printf 'esempio\n' > logs-demo/demo.log, poi sostituisci /var/log con ./logs-demo: vedrai ./logs-demo/demo.log. Un nome che contiene una nuova riga può occupare più righe, quindi questo conteggio non è affidabile come numero di file da elaborare automaticamente. Se find continua a scrivere dopo la chiusura di head, può ricevere SIGPIPE.
find /var/log -type f | head -n 20
head e comandi correlati
| Comando | Ruolo principale | Quando usarlo |
|---|---|---|
head |
Stampa l'inizio | Intestazioni e campioni nell’ordine originale |
tail |
Stampa delle ultime righe e, con opzioni apposite, lettura delle nuove aggiunte | Voci recenti del log |
sed |
Seleziona e trasforma intervalli | Elaborazione di righe più complessa |
less |
Consultazione interattiva con spostamenti e ricerca | Ricerca interattiva |
Avvertenze importanti
I byte non sono caratteri e i conteggi negativi non invertono il file
Con UTF-8 un carattere può occupare più byte: printf '\303\250X' | head -c 1 | od -An -tx1 mostra c3, soltanto il primo byte della lettera «è» in UTF-8. Per escludere una coda con GNU, printf 'a\nb\nc\nd\n' | head -n -2 stampa a e b; printf 'ABCDE' | head -c -2 stampa ABC. Se la coda da escludere è lunga almeno quanto l’input, non rimane nulla. A differenza di un campione iniziale positivo, escludere la fine richiede di proseguire la lettura dell’input: non è un limite al lavoro del produttore.
L’ordine esistente non è una classifica
Head non confronta valori, dimensioni o date. Per esempio printf '2\n100\n9\n' | sort -nr | head -n 2 mostra 100 e 9: è sort, con confronto numerico inverso, a creare quell’ordine. Scegli criteri coerenti con il formato dei dati; un timestamp o un numero dentro una riga complessa non viene interpretato automaticamente. Per salvare un campione usa un nuovo nome, come head -n 5 access.log > sample-access.txt. Non reindirizzare l’output sul file di input: la shell può troncarlo prima che head lo legga.
Interpretare gli stati della pipeline
In Bash, senza pipefail lo stato della pipeline deriva normalmente dall’ultimo comando; un errore del produttore può quindi rimanere nascosto. Con set -o pipefail una terminazione anticipata del produttore per SIGPIPE può rendere non zero lo stato complessivo, anche se head ha ricevuto il campione. Per diagnosticare una pipeline puoi esaminare subito l’array Bash PIPESTATUS, prima che un altro comando lo sostituisca. Distingui un’interruzione attesa da un errore reale di lettura o permessi; non sopprimere indistintamente ogni errore con una gestione generica. Buffer e tempi fanno sì che SIGPIPE non compaia sempre su piccoli input.
FAQ
Quante righe stampa head per impostazione predefinita?
Fino a dieci righe per ciascun input. Un file più corto produce soltanto le righe disponibili e un file vuoto non produce contenuto.
Come stampo solo la prima riga?
Usa head -n 1 file.txt. Senza nome del file, legge lo standard input; per esempio printf 'a\nb\n' | head -n 1 stampa a seguito da nuova riga.
Quale comando stampa le righe finali?
Usa tail: tail -n 1 file.txt seleziona l’ultima riga. Un conteggio negativo di GNU head fa invece l’opposto di questa selezione: esclude una parte finale e conserva ciò che la precede.
Posso stampare il primo kibibyte, cioè 1 KiB?
Con GNU usa head -c 1K file.bin: K vale 1024 byte, mentre 1kB vale 1000 byte. Le versioni attuali accettano anche KiB come prefisso binario. Verifica i suffissi nell’implementazione installata e osserva i dati binari con un visualizzatore adeguato, non come testo arbitrario nel terminale.




