Il comando head di Linux, come il comando tail di Linux, è uno degli strumenti es­sen­zia­li della riga di comando. Fon­da­men­tal­men­te, il comando è usato per vi­sua­liz­za­re l’inizio di un file (di testo) o per limitare l’output di un comando Linux a una de­ter­mi­na­ta quantità.

Il comando head di Linux fa parte delle “GNU Core Utilities” (Coreutils), una raccolta di comandi di base della riga di comando. In linea con la filosofia Unix, i comandi usano un testo come formato uni­ver­sa­le di input e output. Le coreutils sono ri­la­scia­te con licenza open source e sono di­spo­ni­bi­li per una varietà di sistemi operativi diversi.

Perché si utilizza il comando head di Linux

Il comando head di Linux è usato per limitare l’output testuale sulla riga di comando. Ma perché questa opzione è utile o ne­ces­sa­ria? Per ri­spon­de­re alla domanda, diamo un’occhiata a come funziona in generale la riga di comando di Linux. La maggior parte dei comandi di Linux riceve o fornisce, ri­spet­ti­va­men­te, input o output testuali. L’origine o la de­sti­na­zio­ne di un comando possono essere co­sti­tui­te da:

  • File: in par­ti­co­la­re file di testo in formato ASCII. Di minore interesse qui sono i file binari come le immagini JPEG o i documenti Word.
  • Input e output standard: testo che viene vi­sua­liz­za­to o inserito dall’utente nel terminale.
  • Le co­sid­det­te “pipe” (in italiano “tubazioni”) sono con­ca­te­na­zio­ni di diversi comandi Linux. L’output testuale di un comando viene inoltrato come input testuale al comando suc­ces­si­vo.

Con­si­de­ria­mo anche che i file possono contenere quantità in­com­men­su­ra­bi­li di testo. Per esempio, un file di diversi gigabyte contiene miliardi di caratteri! Pertanto, spesso è utile limitare la quantità di testo vi­sua­liz­za­to o vi­sua­liz­za­re se­let­ti­va­men­te solo alcune righe o porzioni di testo. Di seguito vi pre­sen­tia­mo una pa­no­ra­mi­ca dei comandi Linux più comuni uti­liz­za­ti per l’output di file di testo:

  • CAT: vi­sua­liz­za l’intero file. L’output di grandi file so­vrac­ca­ri­ca la riga di comando.
  • LESS: vi­sua­liz­za l’intero file pagina per pagina. Non è pra­ti­ca­bi­le per i file di grandi di­men­sio­ni.
  • HEAD: vi­sua­liz­za l’inizio di un file o limita l’output a un certo in­ter­val­lo.
  • TAIL: vi­sua­liz­za la fine di un file oppure limita l’output a un certo in­ter­val­lo.

Se le spie­ga­zio­ni che vi abbiamo fornito finora vi sembrano astratte, date un’occhiata agli esempi pratici qui sotto. Do­vreb­be­ro per­met­ter­vi di capire i concetti esposti in termini più concreti.

Ese­cu­zio­ne del comando tail di Linux sulla riga di comando

L’ese­cu­zio­ne del comando tail di Linux avviene sulla riga di comando. Nor­mal­men­te viene inserito il nome del comando seguito da parametri opzionali, com­ple­ta­to infine dal nome o dal percorso di uno o più file. Per prima cosa, con­si­de­ria­mo la sintassi del caso generale:

head [opzioni] <file>

Senza opzioni, la sintassi più semplice del comando head di Linux è rap­pre­sen­ta­ta dal seguente schema:

head <file>

In questo modo il comando head di Linux mostra le prime dieci righe del file spe­ci­fi­ca­to. Ciò permette di dare ra­pi­da­men­te un’occhiata all’inizio di un file, ottenendo spesso un’idea del contenuto.

Nell’uso quo­ti­dia­no, il comando head di Linux è spesso combinato con l’opzione '-n'. Ag­giun­gen­do un numero in fondo si definisce quante linee devono essere vi­sua­liz­za­te. Vediamo due esempi. Con la sintassi indicata di seguito viene vi­sua­liz­za­ta solo la prima riga di un file:

head -n 1 <file>

Possiamo usare lo stesso schema per vi­sua­liz­za­re le prime 100 righe di un file:

head -n 100 <file>

Opzioni del comando head di Linux

In base alla con­ven­zio­ne, il comando head di Linux è con­trol­la­to da parametri opzionali. Nell’ambito delle Coreutils GNU, esiste una forma lunga per ogni opzione; per le opzioni più fre­quen­te­men­te usate è di­spo­ni­bi­le anche una forma breve, spesso sto­ri­ca­men­te de­ter­mi­na­ta. Mostriamo qui una pa­no­ra­mi­ca delle opzioni più utili:

Opzione (forma breve / forma lunga) Spie­ga­zio­ne
-n / --lines Limita l’output alle prime n righe/ sopprime l’output delle ultime n righe
-c / --bytes Limita l’output ai primi n byte / sopprime l’output degli ultimi n byte
-q / --quiet, --silent Evita la vi­sua­liz­za­zio­ne dei nomi dei file quando il comando viene usato con più file
-v / --verbose Forza la vi­sua­liz­za­zio­ne dei nomi dei file quando il comando viene usato con più file
--help Mostra in­for­ma­zio­ni au­si­lia­rie del comando
N.B.

Negli esempi seguenti usiamo le opzioni nella forma ab­bre­via­ta (‘-n’, invece di ‘--lines’, ecc.); leggendo anche altri documenti o esempi di codice, sco­pri­re­te che questo è l’uso di gran lunga più uti­liz­za­to.

Excursus: cosa si intende per righe e caratteri?

Prima di con­si­de­ra­re gli esempi pratici, per­met­te­te­ci qualche parola sulla ter­mi­no­lo­gia. Cosa in­ten­dia­mo in realtà quando parliamo di “righe” e “caratteri”? A livello puramente intuitivo, si può cer­ta­men­te dare una risposta a questa domanda. Ma nell’ambiente digitale stret­ta­men­te re­go­la­men­ta­to, abbiamo bisogno di saperlo esat­ta­men­te.

In­ter­na­men­te, un file di testo è una singola stringa continua di caratteri. La fine di ogni riga è con­tras­se­gna­ta solamente da un carattere chiamato “in­ter­ru­zio­ne di linea”. A seconda del sistema operativo, il carattere uti­liz­za­to può essere diverso, il che può portare ad alcune in­con­gruen­ze. In Linux, il carattere “Linefeed” (‘LF’) indica l’in­ter­ru­zio­ne di riga.

Quando si usa l’opzione ‘-c’ / ‘--bytes’, si pre­sup­po­ne che un byte cor­ri­spon­da esat­ta­men­te a un carattere. Questo funziona per il set di caratteri ASCII, ma può causare problemi in altre si­tua­zio­ni. Il set di caratteri Unicode am­pia­men­te usato oggi è una codifica di caratteri “multibyte”. Per rap­pre­sen­ta­re un singolo carattere, possono essere uti­liz­za­ti diversi byte. Se si elaborano file di testo Unicode con il comando head di Linux, possono ve­ri­fi­car­si strani effetti col­la­te­ra­li. Per esempio, usando l’opzione ‘-c’, una vocale accentata (per esempio “à”) può diventare la vocale cor­ri­spon­den­te (“a”).

Esempi di utilizzo del comando head di Linux

Per rendere con­cre­ta­men­te com­pren­si­bi­li gli esempi che seguono, usiamo il testo inglese della Di­chia­ra­zio­ne Uni­ver­sa­le dei Diritti Umani (“Universal De­cla­ra­tion of Human Rights”, UDHR). Con tra­du­zio­ni in più di 460 lingue, è uno dei testi più tradotti nella storia dell’umanità. Sca­ri­chia­mo il testo della di­chia­ra­zio­ne con il comando cURL di Linux e sal­via­mo­lo come file ‘udhr.txt’ sul desktop, eseguendo il seguente frammento di codice nella riga di comando:

curl https://www.unicode.org/udhr/d/udhr_eng.txt> ~/Desktop/udhr.txt

Uti­liz­za­re il comando head di Linux per vi­sua­liz­za­re solo la prima riga

Del modello per l’output della prima riga di un file di testo abbiamo già parlato. Di seguito è riportata la sintassi riferita al nostro esempio concreto:

head -n 1 ~/Desktop/udhr.txt
Consiglio

L’output della prima riga è utile in par­ti­co­la­re per generare il co­sid­det­to “shabang” dello script di un file, ovvero la sequenza che indica al sistema quale in­ter­pre­te uti­liz­za­re per eseguire lo script e il relativo percorso.

Uti­liz­za­re il comando head di Linux per vi­sua­liz­za­re tutto tranne l’ultima riga

Come accade per la prima riga, il comando head di Linux può essere uti­liz­za­to anche per vi­sua­liz­za­re l’intero testo tranne l’ultima riga. Per farlo, usiamo l’opzione ‘-n’ e an­te­po­nia­mo all’argomento un segno meno:

head -n -1 ~/Desktop/udhr.txt

Combinare il comando head di Linux con il comando tail per vi­sua­liz­za­re spe­ci­fi­che aree di testo

Ora, cosa succede se vogliamo vi­sua­liz­za­re solo il preambolo dell’UDHR dalla riga 9 alla 18? Per farlo, uti­liz­zia­mo il comando “gemello” del comando head di Linux. Se il comando head di Linux vi­sua­liz­za la parte iniziale di un file di testo, il comando tail vi­sua­liz­za la fine. Se com­bi­nia­mo i due comandi con il simbolo della pipe ‘|’, possiamo estra­po­la­re un’area definita da un testo:

head -n 18 ~/Desktop/udhr.txt | tail -n 10

È possibile, ad esempio, vi­sua­liz­za­re solo una de­ter­mi­na­ta riga. A tale scopo uti­liz­zia­mo il comando tail con l’opzione ‘-n 1’. Per vi­sua­liz­za­re, ad esempio, solo la riga 28 “Everyone has the right to life, liberty and the security of person.” sfrut­tia­mo il seguente comando.

head -n 28 ~/Desktop/udhr.txt | tail -n 1

Come potete vedere, viene vi­sua­liz­za­ta l’intera riga. Per vi­sua­liz­za­re solo la parte fino a “security”, ag­giun­gia­mo un’altra chiamata del comando head di Linux in­ter­po­nen­do una “pipe”. Quindi uti­liz­zia­mo l’opzione ‘-c’ e proviamo diversi valori come argomento fino a isolare esat­ta­men­te la parte richiesta. In questo caso abbiamo bisogno solo dei primi 62 caratteri:

head -n 28 ~/Desktop/udhr.txt | tail -n 1 | head -c 62

Un metodo più intuitivo può essere quello di contare il numero di caratteri partendo dalla fine. Anche questo è possibile an­te­po­nen­do all’argomento dell’opzione ‘-c’ un segno meno. L’output del comando rimane lo stesso:

head -n 28 ~/Desktop/udhr.txt | tail -n 1 | head -c -12

Infine, vogliamo eliminare gli spazi vuoti iniziali. Pro­ba­bil­men­te avrete già in­do­vi­na­to come possiamo fare. Esatto, ag­giun­gia­mo un altro parametro del comando tail dotando l’argomento dell’opzione ‘-c’ di un segno più. Come accade per il segno meno del comando head di Linux, in questo modo in­ver­tia­mo il si­gni­fi­ca­to dell’opzione: invece di limitare l’output agli ultimi cinque caratteri, limitiamo l’output a tutto ciò che resta dal quinto carattere iniziale in poi:

head -n 28 ~/Desktop/udhr.txt | tail -n 1 | head -c -12 | tail -c +6

Ora vi starete chiedendo se vale davvero la pena costruire un comando così complesso. O c’è un modo più semplice? Ef­fet­ti­va­men­te questo è solo un esempio. L’ope­ra­zio­ne può essere risolta più ele­gan­te­men­te con il comando Sed. Per i file più grandi, tuttavia, il comando head di Linux è più rapido del comando Sed.

Filtrare l’output del comando head di Linux con il comando grep

Avete già visto come il comando head di Linux può essere combinato con il comando tail. Un’altra com­bi­na­zio­ne co­mu­ne­men­te usata è quella con il comando grep per filtrare il testo da vi­sua­liz­za­re. In questo modo possiamo limitare l’output alle righe che con­ten­go­no il termine di ricerca. Delle prime trenta righe del testo dell’UDHR vengono vi­sua­liz­za­te solo quelle che con­ten­go­no la parola “Person”:

head -n 30 ~/Desktop/udhr.txt | grep person

Elaborare più file con il comando head di Linux

Finora abbiamo usato il comando head di Linux per elaborare un singolo file. Tuttavia, è possibile spe­ci­fi­ca­re più file nella stessa chiamata. Per farlo possiamo elencare espli­ci­ta­men­te diversi nomi di file o percorsi oppure possiamo spe­ci­fi­ca­re il contenuto di un’intera directory o una chiave di ricerca come argomento del comando. L’esempio riportato qui mostra quest’ultima soluzione con i file di con­fi­gu­ra­zio­ne presenti nella directory di sistema ‘/etc/’. I file pos­sie­do­no l’esten­sio­ne ‘.conf’ che in­di­chia­mo come chiave di ricerca digitando ‘*.conf’:

head -n 1 /etc/*.conf

Per na­scon­de­re la vi­sua­liz­za­zio­ne dei nomi dei file quando si elaborano più file, si usa l’opzione ‘-q’:

head -q -n 1 /etc/*.conf

Ana­lo­ga­men­te, possiamo usare l’opzione ‘-v’ per forzare la vi­sua­liz­za­zio­ne dei nomi dei file. Questo è utile se alla chiave di ricerca cor­ri­spon­de un unico file.

head -v /etc/host*.conf

Elencare i cinque file mo­di­fi­ca­ti più di recente con il comando head di Linux

In Linux usiamo il comando ls per generare un elenco di file e directory. Con l’opzione ‘-t’, ordiniamo l’elenco in ordine de­cre­scen­te in base alla data dell’ultima modifica. Inoltre, per limitare l’elenco a cinque voci, ag­giun­gia­mo un’altra chiamata del comando head di Linux:

ls -t | head -n 5

Generare un hash casuale di una data lunghezza con il comando head di Linux

Il comando Linux ‘sha512sum’ crea un hash con una lunghezza di 128 caratteri. Per con­fron­ta­re due hash a colpo d’occhio, spesso non è ne­ces­sa­rio esaminare l’hash intero. Può essere suf­fi­cien­te, per esempio, guardare solo i primi otto caratteri. Questo schema potrebbe suonarvi familiare e ri­cor­dar­vi i commit di Git. A tal fine eseguiamo il comando head di Linux con l’opzione ‘-c’. Come fonte dei dati usiamo la funzione bash ‘$RANDOM’ che re­sti­tui­sce un numero casuale:

echo $RANDOM | sha512sum | head -c 8
Vai al menu prin­ci­pa­le