Comando cat in Linux: leggere e concatenare file senza perdere gli originali

cat invia il contenuto dei file allo standard output, normalmente il terminale, e concatena più file nell’ordine indicato. È utile per leggere testi brevi o unire flussi; per cercare e spostarti in un file lungo è più comodo less.

Gli esempi seguenti mostrano lettura, concatenazione, numerazione delle righe e controllo dei caratteri nascosti. Per le prove che creano file usa una cartella nuova: esegui mkdir cat-demo && cd cat-demo e continua soltanto se entrambi i comandi riescono. I nomi dimostrativi devono essere nuovi e distinti dagli originali da conservare.

Il nome deriva dall’inglese concatenate, cioè concatenare. Senza file, oppure usando - come operando, cat legge dallo standard input. Senza opzioni di trasformazione copia i dati in sequenza senza aggiungere separatori; non riscrive gli input. È invece la shell a gestire > e >>: un percorso di output sbagliato può distruggere dati prima che cat inizi a leggerli.

Sintassi di base

cat [OPTION]... [FILE]...

OPTION e FILE sono segnaposto. Gli esempi usano GNU Coreutils: verifica cat --help e man cat sul sistema di destinazione. Racchiudi tra virgolette i nomi con spazi; per un nome che inizia con un trattino usa -- prima dei file, per esempio cat -- ./-note.txt. L’operando esatto - indica comunque lo standard input.

Uso di base di cat

Visualizzare un file

Su Linux il comando seguente mostra il file che identifica la distribuzione, quando presente. L’output dipende dal sistema: potresti vedere campi come NAME e VERSION_ID, ma non tutte le distribuzioni li valorizzano allo stesso modo. Per un file breve cat mostra tutto senza fermarsi a ogni schermata.

cat /etc/os-release

Concatenare più file

Nella cartella dimostrativa crea part-01.txt con printf 'uno\n' > part-01.txt e part-02.txt con printf 'due\n' > part-02.txt. Il comando seguente mostra uno e poi due su due righe. È la nuova riga presente nei file a separarle: se il primo file terminasse senza \n, l’inizio del secondo seguirebbe immediatamente sulla stessa riga.

cat part-01.txt part-02.txt

Salvare il contenuto combinato

Prepara due nuovi input con printf 'Capitolo 1\n' > chapter-1.txt e printf 'Capitolo 2\n' > chapter-2.txt. La riga seguente salva le due righe in book.txt; controllale poi con cat book.txt. Con > la shell crea il file oppure azzera un normale file già esistente; con >> aggiunge in fondo. Usa sempre una destinazione distinta dagli input e controlla che sia davvero sacrificabile.

cat chapter-1.txt chapter-2.txt > book.txt

Verificare il risultato sullo standard output

Questo blocco crea una sottocartella nuova e scrive due righe dimostrative prima di mostrarle. Si ferma se la preparazione fallisce e non cambia la directory della shell principale. Se cat-check esiste già, scegli un altro nome dopo aver controllato che cosa contiene.

(
  mkdir cat-check || exit 1
  cd cat-check || exit 1
  printf 'one\ntwo\n' > sample.txt || exit 1
  cat sample.txt
)

Esempio di output:

one
two

Le due righe stampate corrispondono a quelle nel file, comprese le nuove righe finali; cat non aggiunge intestazioni. Con less sample.txt puoi invece navigare e cercare: normalmente /parola avvia una ricerca e q chiude il visualizzatore. La visualizzazione non dimostra da sola che un file sia valido per il programma che dovrà leggerlo.

Opzioni principali

Opzione Scopo
-n Numera tutte le righe di output, iniziando da 1, comprese quelle vuote.
-b Numera solo le righe non vuote e prevale su -n, indipendentemente dall’ordine. Una riga contenente spazi o tab non è vuota.
-s Riduce più righe vuote consecutive a una sola; non elimina le righe che contengono spazi.
-E Mostra $ prima della nuova riga; una terminazione CRLF viene mostrata come ^M$.
-T Mostra ogni tabulazione come ^I, senza modificarla nel file di input.
-A Equivale a -vET: mostra caratteri di controllo, tabulazioni e fine riga con rappresentazioni visibili.

Esempi pratici

Leggere con i numeri di riga

Per una prova crea app.conf con printf 'alpha\n\nbeta\n' > app.conf. Con -n vedrai i numeri 1, 2 e 3: la seconda riga è vuota ma viene numerata. Con cat -b app.conf saranno numerate soltanto alpha e beta, come 1 e 2. Le opzioni cambiano l’output, non il file; la numerazione continua anche concatenando più input.

cat -n app.conf

Rendere visibili i caratteri nascosti

Crea un file dimostrativo con printf 'echo\tok\r\n' > script.sh, senza eseguirlo. Su GNU/Linux il comando seguente mostra echo^Iok^M$: ^I rappresenta un tab, ^M il ritorno carrello e $ la nuova riga finale. CRLF è la coppia ritorno carrello più nuova riga. -A non converte il file a LF e non corregge il contenuto. Con testo multibyte, per esempio UTF-8, la notazione di -v può risultare poco leggibile: non usarla come verifica completa della codifica.

cat -A script.sh

Salvare lo standard input in un file

Il comando seguente attende il testo che digiti e lo salva in un nuovo memo.txt; non usare il nome di un documento da conservare. In un terminale Linux con la normale modalità di input per righe, scrivi il testo, premi Invio e poi Ctrl+D su una riga vuota per terminare. Se ci sono caratteri in attesa, il primo Ctrl+D può soltanto consegnarli al programma. Dopo il ritorno al prompt controlla con cat memo.txt. EOF significa fine dell’input, non un carattere da aggiungere al file; le impostazioni del terminale possono cambiare il tasto o il comportamento. Per modifiche articolate usa un editor.

cat > memo.txt

cat e comandi correlati

Comando Ruolo principale Quando usarlo
cat Visualizzare o concatenare flussi File brevi e pipeline
less Paginazione interattiva e ricerca File lunghi
tac Invertire l’ordine dei record, normalmente righe Leggere prima le ultime righe
paste Unire le righe corrispondenti Affiancare dati come colonne, con separatori configurabili

Avvertenze importanti

Usare less per i file grandi

Stampare un file grande riempie la cronologia del terminale e rende difficile trovare un punto preciso. less file.log è più adatto alla consultazione; per controllare soltanto l’inizio o la fine valuta head o tail. Nessuno di questi controlli sostituisce l’analisi specifica del formato.

Evitare un output che coincide con un input

Non eseguire cat file > file sui tuoi dati: la shell può azzerare il file prima che cat lo apra. Il problema vale anche con nomi diversi che raggiungono lo stesso file tramite un collegamento fisico o simbolico. Per produrre un risultato modificato scrivi in un file nuovo e indipendente, controlla errori e contenuto e sostituisci l’originale soltanto dopo aver conservato un backup. Non tentare l’auto-concatenazione con >> come rimedio.

Evitare di inviare dati binari a un terminale

Byte di controllo o sequenze di escape possono alterare la visualizzazione del terminale. Per identificare il tipo di file usa file; per esaminarne i byte usa un visualizzatore esadecimale come hexdump o xxd, se installato. cat -A aiuta a diagnosticare piccoli file di testo, ma non è un visualizzatore esadecimale.

FAQ

Il comando cat modifica il file di input?

Normalmente legge l’input e scrive sullo standard output. Le opzioni di visualizzazione modificano soltanto ciò che viene emesso. La shell può però creare, troncare o aggiornare il file indicato dalla redirezione: controlla sempre la destinazione.

Il comando cat aggiunge separatori tra i file?

No. Senza opzioni di trasformazione concatena i contenuti senza aggiungere separatori. Se un file non termina con una nuova riga, il contenuto del successivo prosegue immediatamente; non si tratta di un errore di cat.

Come faccio a mostrare i numeri di riga?

Usa -n per tutte le righe e -b per quelle non vuote. -b prevale su -n; una riga con soli spazi rimane una riga non vuota.

Dovrei usare cat per un log molto lungo?

È possibile, ma per navigare e cercare usa less. Per poche righe iniziali o finali sono più mirati head e tail.

Documentazione di riferimento