Comando cat di Linux: significato e applicazione

Il comando cat di Linux è uno dei comandi Linux più usati. È usato principalmente per mostrare il contenuto di un file sulla riga di comando. Tuttavia, vi sono numerosi altri scopi di utilizzo che illustreremo nel presente articolo.

Cos’è il comando cat di Linux?

Nonostante il suo nome, il comando cat non ha nulla a che fare con i gatti. Di fatto, il comando fa qualcosa di piuttosto banale: il comando cat di Linux legge il contenuto dei file e lo mostra sulla riga di comando. L’origine del nome deriva dal termine “concatenare” (ulteriori informazioni su questo aspetto verranno fornite più avanti).

Guardiamo lo schema di base che si applica quando si richiama il comando cat di Linux. Come potete vedere, scriviamo prima “cat”, seguito eventualmente da opzioni, e poi il nome o il percorso del file o dei file da visualizzare:

cat [Opzioni] <Nome/i file>

Il comando cat di Linux fa parte delle “GNU Core Utilities” (coreutils), una raccolta di comandi di base della riga di comando. I coreutils sono un “Free and Open Source Software” (FOSS) e sono presenti praticamente in tutte le distribuzioni di Linux. Inoltre, il comando cat di Linux è disponibile sia con macOS che con Windows quando si usa il “sottosistema Windows per Linux” (WSL/WSL2).

Consiglio

Per determinare se il comando cat di Linux è disponibile sul vostro sistema, procedete nel modo di seguito indicato. Aprite una riga di comando ed eseguite lì il comando “which cat”. Se il comando cat di Linux è presente sul vostro sistema, viene visualizzato il percorso del file binario cat (ad esempio “/bin/cat”). Se viene visualizzato un messaggio di errore, il comando cat di Linux non è disponibile sul vostro sistema.

Opzioni del comando cat di Linux

Come la maggior parte dei comandi per il terminale, il comando cat di Linux è controllato da parametri opzionali quando viene richiamato. Queste opzioni seguono il nome del comando. Occorre notare che viene fatta una distinzione tra maiuscole e minuscole. Di solito ci sono due grafie per la maggior parte delle opzioni:

1. Forma abbreviata: -, per esempio “cmd -h”

La forma breve non è molto eloquente. Diverse opzioni possono essere combinate in una, ad esempio “ls -la” invece di “ls -l -a”. La forma breve è adatta per lavorare rapidamente con comandi conosciuti sulla riga di comando.

2. Forma estesa: --, per esempio “cmd –help”

La forma estesa è facile da capire, ma richiede più tempo per la scrittura e occupa più spazio. La forma estesa è adatta alla creazione di script. I nomi delle opzioni eloquenti sono usati per scopi di documentazione.

Diamo un’occhiata alle opzioni più importanti del comando cat di Linux.

Opzione Spiegazione
-h, --help Visualizza l’aiuto del comando cat di Linux
-n Numera le righe dell’output
-s Combina più righe vuote in una sola
-b Numera tutte le righe dell’output tranne le righe vuote
-v Emette caratteri invisibili
-e Come -v, incluso il marcatore di fine riga
-t Come -v, incluso il marcatore di tabulazione
-et Combinazione di -e e -t; emette tutti i caratteri invisibili

Cosa significa di fatto concatenazione?

Il nome del comando cat di Linux deriva da “concatenare”, a sua volta ricavato dal termine di origine latina “catena”. La concatenazione è un concetto importante nell’informatica. Il termine descrive il concatenamento, l’allineamento o l’unione di elementi di strutture di dati di contenitori simili. In particolare, nella maggior parte dei linguaggi, diversi array o stringhe possono essere combinati in un unico array o in un’unica stringa. In questo processo, i singoli elementi dei contenitori concatenati sono riuniti in un nuovo contenitore mantenendo l’ordine.

Un semplice esempio in pseudocodice: passiamo alla funzione cat diverse stringhe, che vengono combinate in una sola stringa:

cat("Pietro ", "e ", "Paolo") -> "Pietro e Paolo"

Il comando cat di Linux fa concettualmente la stessa cosa: come elementi, elabora righe raggruppate all’interno di file.

Diversi linguaggi di programmazione usano simboli diversi per l’operatore di concatenazione delle stringhe. Guardiamo alcuni esempi di linguaggi di programmazione diffusi. In tutti i casi, il risultato della concatenazione è la stringa “Pietro e Paolo”:

Operatore Linguaggio(i) Esempio
+ Java, JavaScript, Python Pietro + "e" + " Paolo"
. PHP, Perl Pietro . "e" . " Paolo"
.. Lua Pietro ... "e" ... " Paolo"
~ Twig Pietro ~ "e" ~ " Paolo"
& VisualBasic Pietro & "e" & " Paolo"

Alcuni linguaggi, in particolare Python, usano lo stesso operatore per concatenare altre strutture di dati del contenitore come le liste:

# concatenare le liste
[1, 2, 3] + [45, 56, 67]
# -> [1, 2, 3, 45, 56, 67]
# nota bene NON:
# [[1, 2, 3], [45, 56, 67]]
# concatenare le tuple
(1, 2) + (33, 44)
# -> (1, 2, 33, 44)

Il linguaggio di statistica “R” è interessante; non conosce un operatore di concatenazione. Viene invece usata la funzione “c()”. Avete tre tentativi per indovinare per cosa significa “c” – ecco la risposta giusta: “concatenate”. Qui viene mostrata la concatenazione annidata di diversi valori:

c(c(1, 2, 3), c(45, 56, 67))
# -> 1, 2, 3, 45, 56, 67

Come viene utilizzato in pratica il comando cat di Linux?

L’uso effettivo del comando cat di Linux è limitato, in linea con la filosofia UNIX “fai una cosa, e falla bene”. La maggior parte degli scenari operativi risultano dal concatenamento del comando con altri comandi. Vengono utilizzati i reindirizzamenti dell’input e dell’output standard. In particolare, si tratta dei cosiddetti “pipe” e “redirect”, che sono approntati dalla “shell”; il loro uso si estende a tutti i comandi:

Reindirizzamento

Simbolo

Impiego

Spiegazione

Pipe

|

cmd1 | cmd2

Inoltro dell’output del comando cmd1 all’input del comando cmd2

Input-Redirect

<

cmd < data

Legge l’input al comando cmd proveniente dal file data

Output-Redirect

>

cmd > data

Scrive l’output del comando cmd nel file data; nell’eventualità, il file esistente viene sovrascritto

Output-Redirect

>>

cmd >> data

Scrive l’output del comando cmd nel file data nell’eventualità, il file esistente viene esteso

Il comando cat di Linux viene spesso usato con una serie di altri comandi Linux. Vediamo alcuni dei più comuni.

Comando Linux

Spiegazione

split

Divide un file in pezzi; l’operazione può essere invertita con la funzione cat

uniq

Rimuove le righe di input che si ripetono più di una volta

sort

Ordina le righe di input in modo alfanumerico

head, tail

Limita l’output alle righe all’inizio/alla fine

Passiamo ora ai casi di uso comune del comando cat di Linux.

Usare il comando cat di Linux per produrre file sulla riga di comando

Probabilmente l’uso più comune del comando cat di Linux è quello di emettere l’intero contenuto di un file sulla riga di comando, il che è utile per dare una rapida occhiata a un file. A differenza dell’apertura del file in un editor, non dovete aver paura di modificare il file per sbaglio. Ecco un esempio di output di un file sulla riga di comando:

cat ./path/to/file.txt

Vediamo alcuni scenari comuni. Immaginate di essere collegati via SSH su un server su cui è operativo WordPress. Siete nella directory principale di WordPress e volete visualizzare il contenuto del file di configurazione “wp-config.php”. In questo caso basta richiamare il comando cat di Linux nel modo seguente:

cat wp-config.php

Spesso è sufficiente l’output di un file sulla riga di comando. Tuttavia, in alcuni casi potremmo voler copiare il contenuto del file negli appunti. Inoltre, l’output visibile sulla riga di comando può rappresentare un rischio in caso di dati sensibili. In entrambi i casi, è una buona idea inoltrare l’output del comando cat di Linux a un programma che scrive i dati negli appunti. Con macOS è disponibile a tal fine lo strumento per la riga di comando “pbcopy”; con Windows con WSL/2 e le varie distribuzioni Linux sono disponibili strumenti equivalenti come “clip” o “xclip”.

Consideriamo il seguente esempio: vogliamo copiare la nostra chiave pubblica SSH per creare un repository GitHub. Supponiamo inoltre che la chiave chiamata “id_rsa.pub” si trovi nella directory “.ssh/” nella nostra directory utente. Poi con macOS ricorriamo allo stratagemma richiamando il comando cat di Linux nel modo seguente:

cat ~/.ssh/id_rsa.pub > pbcopy

Come suggerisce il nome del comando cat di Linux, è possibile combinare diversi file ed emetterli in una sola volta. Immaginiamo di aver salvato liste di frutta, verdura e latticini in tre file nella directory “food/”. Richiamando il comando cat di Linux nel modo seguente, combiniamo tutte e tre le liste in una sola e la scriviamo nel file “food.txt”:

cat ./food/fruit.txt ./food/veggies.txt ./food/dairy.txt > food.txt

Come avviene di solito sulla riga di comando, possiamo usare il segnaposto "*" per selezionare tutti i file in una directory:

cat ./food/*.txt > food.txt

Scrivere testo in un file con il comando cat di Linux

Usando i reindirizzamenti di output già menzionati, si può scrivere testo in un file con il comando cat di Linux. Tale funzione può essere utilizzata in tre modi:

  1. Creare un nuovo file in cui viene scritto il testo inserito.
  2. Sovrascrivere un file esistente con il testo inserito.
  3. Allegare il testo inserito a un file esistente.

Analizziamo questi tre casi. Per prima cosa, scriviamo testo in un file non esistente dalla riga di comando:

  1. Richiamare il comando cat di Linux e inoltrare l’output a un file non esistente. Il comando accetta dati dall’input standard finché non viene letto il carattere di fine file (“End-of-file”, EOF):
cat > new.txt
  1. Inserire il testo desiderato sulla riga di comando.
  2. Terminare l’inserimento premendo la combinazione di tasti [Ctrl] + [D]. Questa combinazione di tasti corrisponde al carattere di fine file.

Il testo inserito si trova ora nel file “new.txt”. Verifichiamo ciò richiamando il comando “cat new.txt”.

Applichiamo lo stesso approccio per allegare il testo inserito a un file esistente:

  1. Richiamare il comando cat di Linux e inoltrare l’output al file esistente:
cat >> existing.txt
  1. Inserire il testo desiderato sulla riga di comando.
  2. Terminare l’inserimento premendo la combinazione di tasti [Ctrl] + [D].

Se usiamo il simbolo ">" invece dell’inoltro dell’output ">>", il file esistente viene sovrascritto con il testo inserito. Attenzione quando si impiega questa funzione: il contenuto precedente del file è perso irrevocabilmente!

Preparare i dati per un’ulteriore elaborazione con il comando cat di Linux

Un uso comune del comando cat di Linuxè quello di combinare dati da più file. Spesso i dati aggregati passano attraverso un filtro ai fini della preparazione a un’ulteriore elaborazione. Questo schema si verifica sempre quando dati simili sono distribuiti su più file. Ogni file contiene una voce per riga. Pensate, per esempio, a liste di nomi, indirizzi IP o simili.

Per avere una visione d’insieme di tutte le caratteristiche dei dati, si pone il seguente compito: vogliamo combinare tutte le voci, rimuovendo qualsiasi voce duplicata. Infine, le voci devono essere ordinate e scritte in un nuovo file. Come esempio concreto, immaginiamo di avere un insieme di file di testo. Ogni file contiene i nomi degli attori in un particolare episodio della serie comica “I Simpson”. Se combiniamo le voci di tutti i file come descritto, otteniamo una lista di tutti gli attori dei Simpson.

I file descritti nel nostro esempio con gli attori dei Simpson dai singoli episodi avrebbero schematicamente un aspetto simile a questo:

simpsons-1.txt simpsons-2.txt simpsons-3.txt
LisaMargeHomerFlanders BartLisaHomerMilhouse BartMaggieNelson

Supponiamo inoltre che i singoli file di testo si trovino nella directory “simpsons/”. Basta dunque richiamare il comando cat di Linux nel modo seguente, concatenato con i comandi “uniq” e “sort”, per scrivere la lista di tutti gli attori dei Simpson nel file “simpsons.txt”:

cat ./simpsons/*.txt | uniq | sort > simpsons.txt

Numerazione delle righe di un file di testo con il comando cat di Linux

Un uso comune del comando cat di Linux è quello di numerare le linee di un file di testo. Immaginiamo di avere un file di testo con voci, per l’esattezza una voce per riga. Ora vogliamo anteporre a ogni riga con il numero di riga. Questa funzione è utile, per esempio, quando trasmettiamo il file risultante a un altro utente per la revisione. Ciò permette a entrambe le parti di fare riferimento a righe specifiche nella corrispondenza.

Con il comando cat di Linux, questa operazione è molto semplice da attuare. Usiamo l’opzione “-n” e un reindirizzamento dell’output:

cat -n doc.txt > doc.numbered.txt

Nello scenario descritto, può essere utile numerare tutte le righe tranne quelle vuote. Inoltre, combiniamo diverse righe vuote in una sola. Per questo si usa la combinazione delle opzioni “-s” e “-b”:

cat -sb doc.txt > doc.numbered.txt

Combinare i file modello con il comando cat di Linux

Un modello ben noto della programmazione web è quello di assemblare documenti da singoli elementi. Dalla combinazione delle cosiddette parti modello con parti uniche risultano documenti diversi con una struttura coerente. Normalmente si usa PHP con l’istruzione “include” o un linguaggio di template speciale come Twig. Tuttavia, lo stesso principio può essere implementato anche con il comando cat di Linux.

Immaginiamo di avere diverse parti di modello nella directory “parts/”. L’intestazione e il piè di pagina devono essere identici in tutti i documenti generati. La struttura e il contenuto dell’intestazione e del piè di pagina sono definiti nei file “header.html” e “footer.html”. Inoltre, ci sono diversi file con il contenuto effettivo dei documenti nella directory “main/”. I documenti finiti vengono salvati nella directory di output “www/”. Per creare un documento, è sufficiente richiamare il comando cat di Linux nel modo seguente:

cat ./parts/header.html ./main/home.html ./parts/footer.html > ./www/index.html

Un altro scenario operativo: Una base di codice deve essere corredata di un testo di licenza per la pubblicazione. La licenza deve essere inserita all’inizio di ogni file di codice. Immaginiamo il seguente layout di directory:

  • file di codice sorgente Python con estensione “.py” nella directory “src/”
  • un file di licenza “license.py” nella directory “inc/”
  • una directory inizialmente vuota “dist/” per archiviare i file elaborati

Usiamo il comando cat di Linux all’interno di un ciclo for. Ogni volta che il corpo del ciclo viene eseguito, lo stesso file di licenza viene concatenato con uno dei file sorgente. Il risultato viene scritto in un nuovo file di codice sorgente con lo stesso nome:

for file in ./src/*.py ; do
    cat ./inc/license.py "$file" > "./dist/${file}"
done

Unire file divisi con il comando cat di Linux

Il comando cat di Linux viene usato perlopiù per elaborare file di testo semplici. Tuttavia, il comando funziona anche con i file binari. Questa funzionalità è utile in alcuni casi. Da un lato, i comandi Linux “split” o “csplit” possono essere usati per riassemblare file che sono stati divisi in più parti. Mostriamo di seguito l’approccio generale:

# nome del file da disassemblare
file_name="./path/to/file"
# specifichiamo esplicitamente l’estensione del file per aggiungerla dopo l’assemblaggio
extension="txt"
# disassemblare il file originale in parti da 10 kilobyte con il prefisso 'part_'
split -b 10k "${file_name}.${extension}" part_
# assemblare le singole parti in un nuovo file
cat part_* > combined
# ripristinare l’estensione originale del file
mv combined "combined.${extension}"

D’altra parte, il comando cat di Linux si presta a combinare download parziali. Molti strumenti consentono di interrompere i download e di farli proseguire in un momento successivo. Questo è particolarmente utile quando si scarica un file di grandi dimensioni con una connessione di rete debole. Provate pure l’esempio sul vostro sistema:

# creare una cartella di prova sul desktop
mkdir ~/Desktop/cat-test/
# passare alla cartella di prova
cd ~/Desktop/cat-test/
# immagine del gatto di dominio pubblico da WikiMedia
image=https://upload.wikimedia.org/wikipedia/commons/f/fa/Cat_using_computer.jpg
# scaricare l’immagine con "curl" in due parti
curl -s -r 0-500000 "$image" -o first-half &
curl -s -r 500001- "$image" -o second-half &
wait
# combinare le parti e scrivere sul file JPEG
cat first-half second-half > image.jpg

Combinare i flussi di dati con il comando cat di Linux

Il comando cat di Linux può essere usato per combinare i flussi di dati nell’elaborazione video. Mostriamo di seguito il modello generale. Per prima cosa, creiamo diversi brevi flussi video da un’immagine JPEG usando il comando ffmpeg. Poi li combiniamo in un unico video continuo:

# creare un ciclo (loop) dall’immagine
ffmpeg -y -loop 1 -i image.jpg -t 3 \
    -c:v libx264 -vf scale=w=800:h=-1 \
    still.ts
# creare una dissolvenza di apertura (fade-in) dall’immagine
ffmpeg -y -loop 1 -i image.jpg -t 3 \
    -c:v libx264 -vf scale=w=800:h=-1,fade=in:0:75 \
    fadein.ts
# creare una dissolvenza di chiusura (fade-out) dall’immagine
ffmpeg -y -loop 1 -i image.jpg -t 3 \
    -c:v libx264 -vf scale=w=800:h=-1,fade=out:0:75 \
    fadeout.ts
# combinare fade-in, loop e fade-out
cat fadein.ts still.ts fadeout.ts > video.ts

Quando non dovreste usare il comando cat di Linux?

L’uso superfluo del comando cat di Linux è un noto “anti-pattern”. Ciò è descritto in numerosi articoli; esiste addirittura un “riconoscimento per l’utilizzo inutile di cat”. La regola di base è la seguente: il comando cat di Linux dovrebbe essere usato quando è necessario combinare diversi file. Se volete elaborare un singolo file, questa operazione è solitamente possibile senza cat.

Vediamo l’approccio generale che può aiutarci a minimizzare l’uso inutile del comando cat di Linux. Il seguente schema si trova spesso nei contributi dei forum e negli articoli dei blog:

cat example.txt | less

Il comando cat di Linux viene richiamato per leggere un singolo file. L’output viene trasmesso tramite reindirizzamento della pipe al comando less per visualizzare il contenuto del file pagina per pagina. Tuttavia, ciò è possibile anche in modo più semplice:

less < example.txt

Richiamiamo il comando less e usiamo il reindirizzamento dell’input della shell per leggere il file. E anche questo approccio può essere ulteriormente semplificato:

less example.txt

Invece di usare il reindirizzamento dell’input, trasmettiamo il file da elaborare al comando less. Questa operazione è possibile perché quasi tutti i comandi di Linux prendono i nomi dei file come parametri.

Quali alternative ci sono al comando cat di Linux?

Come descritto sopra, il comando cat di Linux viene spesso usato inutilmente. Esistono alternative per alcuni degli scenari d’uso più comuni. Qui mostriamo tre esempi:

Comando Uso alternativo Esempio
less / more Emettere il contenuto del file pagina per pagina sulla riga di comando less file.txt, more file.txt
touch Creare un nuovo file vuoto touch new.txt
echo Scrivere testo nel file echo "testo" > file.txt

Quali sono i comandi simili al comando cat di Linux?

Vi sono alcuni comandi Linux simili al comando cat. Per mantenere un tono “scherzoso”, i nomi di questi comandi riprendono spesso il termine “cat”. Innanzitutto esiste il comando tac, il cui nome è semplicemente cat letto al contrario. Ecco come funziona il comando tac: come il comando cat di Linux, ma con l’output invertito. Di conseguenza, quando il comando tac viene richiamato con un singolo file, l’ultima riga viene emessa per prima, anziché la prima come con cat.

Un altro comando con un nome simile al comando cat di Linux è il comando nc, un’abbreviazione per “netcat”. Il comando viene comunemente definito come il “coltellino svizzero per TCP/IP”. Invece di operare su file locali come cat, netcat legge e scrive dati su connessioni di rete. Potete ottenere maggiori informazioni nel nostro articolo sull’argomento.

Come alternativa più recente al comando cat di Linux, è stato aggiunto il comando bat. Sulla pagina GitHub del comando, questo viene definito come “Un clone di cat con le ali” (“A cat clone with wings”). Il comando bat mantiene la funzionalità di base del comando cat di Linux, ma offre alcune comode funzioni. In particolare, il comando bat aggiunge l’evidenziazione della sintassi all’output dei file di codice sorgente.

Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.