Salta al contenuto principale

cat: mostra e unisce il contenuto dei file

Inviato da tuxsa il

cat mostra a schermo il contenuto di un file di testo e permette di unire più file in uno solo. Dopo aver imparato a creare, copiare, spostare ed eliminare i file, è il momento di guardarci dentro.

Cos'è

cat è l'abbreviazione di concatenate, "concatena": il suo scopo originario era unire file uno dopo l'altro. Il fatto che serva anche a leggerli è una conseguenza, perché il risultato della concatenazione viene stampato a schermo. Fa parte del pacchetto GNU coreutils ed è un eseguibile (/usr/bin/cat), presente su qualsiasi distribuzione GNU/Linux.

Cosa fa

Legge i file indicati, nell'ordine in cui li scrivi, e ne stampa il contenuto sullo standard output, cioè di norma il terminale. Se non indichi nessun file, legge ciò che arriva dallo standard input: la tastiera o l'output di un altro comando. Non modifica i file che legge.

Come si usa

Sintassi base:

$ cat [opzioni] [file...]

Esempio 1: leggere un file

$ cat lista.txt
mele
pere
arance

Esempio 2: mostrare più file di seguito

$ cat lista.txt note.txt
mele
pere
arance
ricordarsi di comprare il pane

I contenuti vengono stampati uno dopo l'altro, senza separatori. Se un file non finisce con un a capo, la sua ultima riga si attacca alla prima del file successivo.

Esempio 3: unire più file in uno nuovo

Combinando cat con il reindirizzamento >, l'output finisce in un file anziché sullo schermo:

$ cat capitolo1.txt capitolo2.txt capitolo3.txt > libro.txt

Con >> il testo viene invece aggiunto in fondo a un file esistente:

$ cat nuove_righe.txt >> lista.txt

Esempio 4: numerare le righe con -n

$ cat -n lista.txt
     1	mele
     2	pere
     3	arance

Con -b vengono numerate solo le righe non vuote.

Esempio 5: comprimere le righe vuote con -s

Se un file contiene lunghe sequenze di righe vuote, -s (squeeze) le riduce a una sola:

$ cat -s testo_con_buchi.txt

Esempio 6: scoprire i caratteri invisibili con -A

L'opzione -A mostra anche i caratteri che di solito non si vedono: $ indica la fine di ogni riga, ^I una tabulazione, ^M un ritorno a capo in stile Windows. È utilissima quando uno script o un file di configurazione "non funziona" senza un motivo apparente:

$ cat -A script.sh
#!/bin/bash^M$
echo "ciao"^M$

Quei ^M alla fine delle righe indicano che il file arriva da Windows e può dare errori in Linux.

Esempio 7: scrivere un file dalla tastiera

Senza argomenti, cat legge dalla tastiera. Reindirizzando l'output puoi creare un piccolo file senza aprire un editor:

$ cat > promemoria.txt
Chiamare il tipografo
Preparare la bozza

Per terminare, premi Ctrl+D su una riga vuota. Attenzione: se promemoria.txt esiste già, viene sovrascritto. Con >> aggiungeresti invece il testo in fondo.

Esempio 8: creare un file con più righe (heredoc)

Per scrivere un testo di più righe, soprattutto negli script, si usa la sintassi here document:

$ cat << 'FINE' > config.ini
[sito]
nome=mio_sito
porta=8080
FINE

Tutto ciò che sta tra la prima riga e la parola FINE viene scritto nel file. Le virgolette attorno a FINE impediscono alla shell di interpretare variabili come $HOME dentro il testo.

Esempio 9: cat in una pipeline

L'output di cat può essere passato ad altri comandi con il simbolo |:

$ cat lista.txt | wc -l
3
$ cat lista.txt | sort
arance
mele
pere

Funziona, ma spesso non serve: la maggior parte dei comandi legge direttamente un file (wc -l lista.txt, sort lista.txt). Usare cat solo per passare un file a un altro comando è un'abitudine così diffusa che ha un nome scherzoso tra gli esperti: "uso inutile di cat". Non è un errore, ma è un processo in più.

Esempio 10: uso negli script

Per unire tutti i file di log di un mese in uno solo:

#!/bin/bash
cat log_ottobre_*.txt > log_ottobre_completo.txt
echo "Righe totali: $(cat log_ottobre_completo.txt | wc -l)"

Opzioni utili

  • -n: numera tutte le righe.
  • -b: numera solo le righe non vuote.
  • -s: riduce le righe vuote consecutive a una sola.
  • -A: mostra i caratteri invisibili (fine riga, tabulazioni, caratteri di controllo).
  • -E: mostra un $ alla fine di ogni riga.
  • -T: mostra le tabulazioni come ^I.

Attenzione a

  • I file lunghi: cat stampa tutto in una volta e la schermata scorre via. Per i file grandi è più comodo un programma di lettura a pagine come less, oppure head e tail per vedere solo inizio e fine.
  • I file binari: stampare un'immagine, un programma o un archivio può riempire il terminale di caratteri strani e renderlo illeggibile. Se succede, scrivi reset (anche alla cieca) e premi Invio.
  • Mai cat file > file: la shell svuota il file di destinazione prima che cat lo legga, e perdi tutto il contenuto. Lo stesso vale per cat file | sort > file e simili: scrivi su un file diverso e poi rinominalo con mv.
  • > sovrascrive, >> aggiunge: confonderli è un errore classico. Con file importanti usa >> oppure fai prima una copia con cp.
  • File inesistente: se il nome è sbagliato, cat risponde File o directory non esistente. Controlla con ls e con il completamento automatico (Tab).
  • Un comando affine: tac (il nome è cat scritto al contrario) stampa le righe dall'ultima alla prima.

Riepilogo

ComandoCosa fa
cat fileMostra il contenuto di un file
cat a bMostra più file di seguito
cat a b > cUnisce più file in un file nuovo
cat a >> bAggiunge il contenuto di a in fondo a b
cat -n fileMostra il file con le righe numerate
cat -A fileRivela i caratteri invisibili
cat > fileScrive un file dalla tastiera (termina con Ctrl+D)
tac fileMostra il file dall'ultima riga alla prima

Nel prossimo articolo: less, il comando per leggere file lunghi una pagina alla volta.