Il comando cat linux è un comando molto utilizzato quando si lavora con la shell, che sia bash, zsh o altre il comando cat è sempre presente e usato.
Cat ha la funzione di leggere i dati da un file e mostrarli in output. Questa sua semplicità in realtà lo porta ad essere un tool molto versatile e quindi indispensabile da conoscere quando usiamo spesso il terminale.
Visto che si tratta di un comando linux concettualmente molto semplice, cercheremo di vederlo attraverso esempi pratici che ci permetteranno di capirne a pieno le potenzialità.
Sommario
- Leggere un singolo file
- Leggere più di un file
- Leggere un file con numeri di riga
- Creare un file vuoto
- Copiare il contenuto di un file in un altro
- Appendere il contenuto di un file in coda a un altro
- Copiare più di un file in un singolo file
- Eliminare multiple righe vuote
- Il comando tac, ovvero cat al contrario
- Visualizzare i caratteri di fine riga, tab e “nonprinting characters”
- Aprire file che iniziano con –
- Leggere file lunghi
- Wildcards e cat: leggere tutti i file di testo da una cartella
- Conclusioni
Leggere un singolo file
L’utilizzo base di cat è, come abbiamo detto nell’introduzione, quello di permettere di leggere un file e stamparlo a schermo. Questa funzione è particolarmente utile per file abbastanza corti, di poche righe, in quanto l’output verrà semplicemente stampato nel terminale e non avremo modo di navigarlo come ad esempio possiamo fare con less o vi.
cat informaticappunti.txt
Il risultato di questo comando sarà il contenuto del file di testo informaticappunti.txt stampato nel terminale.
Vediamo un primo output di esempio:
Leggere più di un file
Possiamo usare cat per leggere più di un file alla volta. In questo caso il comando cat ci stamperà prima il contenuto del primo file, poi quello del secondo, e così via.
Anche in questo caso se il vostro obiettivo è quello di leggere visivamente i file è meglio usare file con un numero contenuto di righe.
La sintassi del comando cat in questo caso è cat file1 file2 file3… filen
cat infapp01.txt infapp02.txt
L’output sarà quindi la concatenazione del contenuto dei due file.
contenuto infapp01
contenuto infapp02
Leggere un file con numeri di riga
Se vogliamo che cat aggiunga nell’output i numeri di riga del file letto possiamo usare l’opzione -n
. Il numero di riga verrà aggiunto all’inizio di ogni riga stampata.
Questa funzione è comoda nei casi in cui avessimo bisogno di filtrare ad esempio tramite il comando grep un file particolarmente grande e poi volessimo rintracciare tramite il numero di riga le parti che abbiamo selezionato.
Un esempio del comando cat -n
è il seguente:
cat -n file1.txt
In questo caso l’output sarà simile a quello della figura seguente:
L’opzione cat -n
numera tutte le righe, comprese quelle vuote. Se vogliamo invece numerare solamente le righe non vuote, possiamo usare l’opzione cat -b
che sovrascrive -n
nel caso siano presenti entrambe.
Creare un file vuoto
Creare un file da riga di comando è un’operazione che può capitare di dover fare. Per farlo velocemente ci sono almeno due modi: si può usare il comando touch <nomefile>
oppure si può utilizzare cat. Il comando da eseguire in questo caso sarà:
cat > <nomefile>
Una volta premuto invio il comando non terminerà ma rimarrà in attesa di ulteriori input. Se vogliamo scrivere del testo nel file possiamo farlo ora.
Una volta terminato di scrivere il testo che vogliamo inserire nel file, o subito dopo aver premuto invio se vogliamo creare un file vuoto, basterà premere la combinazione <Ctrl> + d
per terminare il comando e tornare al prompt del terminale.
Cat per copiare il contenuto di un file in un altro
Abbiamo visto nell’esempio precedente come è possibile utilizzare cat in combinazione con l’operatore di redirezione >
per creare un nuovo file.
Possiamo sfruttare lo stesso operatore per copiare tutto il contenuto di un file in un altro. In questo caso dovremo solamente aggiungere il nome del file di partenza come argomento invece di eseguire il comando cat senza argomenti.
cat fileInput.txt > fileOutput.txt
In questo caso stiamo dicendo a cat di leggere dal file fileInput.txt
e di redirezionare l’output nel file fileOutput.txt
. In questo caso l’output non viene mostrato a schermo ma viene direttamente trasferito nel nuovo file.
Se il file di output non esiste verrà creato, nel caso in cue invece questo fosse già presente il file vecchio viene interamente sostituito dal nuovo senza nessun avviso. Attenzione quindi in questo caso a non fare errori e sovrascrivere file sbagliati.
Appendere il contenuto di un file in coda a un altro
Se vogliamo utilizzare l’operatore di redirezione per appendere il contenuto di un file in coda a un altro invece di sovrascrivere il file di destinazione possiamo usare l’operatore doppio >>
.Questo, al contrario di quello singolo, appende in coda al file di destinazione se già esiste invece di sovrascriverlo.
cat fileInput.txt >> fileOutput.txt
Anche in questo caso il contenuto non verrà mostrato sullo schermo ma verrà direttamente scritto in coda al file di destinazione. Ricordiamoci che questa operazione non è reversibile, se sbagliamo non possiamo semplicemente ripetere il comando ma dovremo prima andare a rimuovere manualmente ciò che abbiamo erroneamente aggiunto in coda al file di output.
Vediamo un esempio in questa schermata:
In questo caso abbiamo preso il contenuto di fileInput.txt
e lo abbiamo appeso in coda a fileOutput.txt
. Un’esecuzione del comando cat sul file di output ci conferma che abbiamo ottenuto quanto ci aspettavamo.
Copiare più di un file in un singolo file
Possiamo mettere insieme alcuni degli esempi precedenti e utilizzare il comando cat per leggere più di un file, e poi redirezionare l’output per copiare tutto in un singolo file. Si tratta di un modo facile e veloce per fare join di due o più file.
Potremo ad esempio scrivere:
cat fileInput01.txt fileInput02.txt > fileOutput.txt
In questo modo il contenuto dei due file di partenza verrà concatenato e scritto in fileOutput.txt
che conterrà quindi l’unione dei due file.
Eliminare multiple righe vuote
Una pratica opzione che può capitare più raramente di dover utilizzare ma che è sempre comodo tenere a mente è l’opzione -s
. Questa opzione leggerà il file, e quando incontrerà più di una riga vuota di seguito, ne mostrerà in output solamente una. In questo modo possiamo rendere più leggibili file che per qualche motivo hanno punti con più di una riga vuota di seguito.
Vediamo la sintassi:
cat -s fileInput.txt
E un semplice esempio:
Questo esempio ci evidenzia come non importa quante righe vuote ci sono fra un testo e l’altro, cat le ridurrà sempre a una.
Il comando tac, ovvero cat al contrario
In questo caso il nome del comando si spiega quasi da solo. Il comando tac farà infatti esattamente il contrario del comando cat: leggerà cioè il file dall’ultima riga alla prima invece che dalla prima all’ultima.
La sintassi di questo comando è piuttosto semplice:
tac <nomefile>
In questo caso il comando tac non dispone di tutte le opzioni di cat, ma potremo comunque utilizzare gli operatore di redirezione nello stesso modo in cui li abbiamo utilizzati per cat.
Se avete per forza bisogno di utilizzare un’opzione di cat ma leggere il file come lo leggerebbe tac potete utilizzare le pipe e indirizzare l’output di tac al comando cat.
L’uso del comando cat in linux è spesso congiunto all’uso delle pipe. Cat ci permette infatti di leggere il file e “introdurlo nella pipe” per poi manipolarne il contenuto con altri comandi come ad esempio grep.
Vediamo quindi come usare tac, cat e pipe per applicare un’opzione di cat ad un input letto tramite tac.
tac fileInput.txt | cat -s
In questo modo leggeremo il file fileInput.txt
dell’esempio precedente al contrario e poi useremo cat per rimuovere le righe vuote duplicate.
In questo caso abbiamo letto il solito file con tac invertendone l’ordine e l’abbiamo passato tramite la pipe |
al comando cat -s
che ha provveduto ad eliminare le righe vuote in più.
Visualizzare i caratteri di fine riga, tab e “nonprinting characters”
Tramite l’opzione cat -E
è possibile stampare il contenuto del file visualizzando i caratteri di fine riga. Questi verranno evidenziati tramite l’aggiunta del carattere $.
Vediamo direttamente un esempio con il file usato negli esempi precedenti.
Allo stesso modo è possibile usare l’opzione -T
per evidenziare i caratteri TAB all’interno del file. Quest verranno mostrati come ^I
all’interno del testo.
Infine è possibile evidenziare i cosiddetti “non-printing characters”, ovvero caratteri che servono solamente a scopo di formattazione. Per questa evenienza è presente l’opzione -v
.
Esistono poi una serie di altre opzioni che in sostanza combinano due o tutte e tre le opzioni precedenti:
-e
: equivalente a scrivere -vE-t
: equivalente a scrivere -vT-a
: equivalente a scrivere -vET
Aprire file che iniziano con –
Si tratta di una situazione piuttosto infrequente, ma come comportarsi se ci si trova davanti un file il cui nome inizia per -. In questo caso eseguendo cat normalmente avremo sicuramente molti problemi in quanto i comandi linux interpretano il -
come carattere riservato per la definizione delle opzioni.
Cosa fare quindi se ci si trova davanti a un file che inizia con -? Combattiamo un – con due -! Spiegato testualmente può sembrare un po’ poco comprensibile ma vediamo un esempio con il nostro solito file che per l’occasione è stato rinominato in -fileInput.txt
.
cat -- "-fileInput.txt"
Fatto! avremo letto il nostro file, e se necessario potremo sfruttare le pipe per farlo leggere anche ad altri comandi.
Cat per leggere file lunghi
Abbiamo parlato fino ad ora del fatto di leggere file corti che possano entrare nella schermata del terminale in quanto cat legge tutto il file di seguito e non ci permette di fermarci o tornare indietro. Coma facciamo quindi per leggere un file lungo dal terminale linux?
In questo caso ci vengono in aiuto due comandi linux: il comando less
e il comando more
.
Il comando less si può utilizzare da solo, basterà scrivere less <nomefile>
e ci si aprirà il lettore less con il quale potremo scorrere il testo andando avanti, indietro e facendo ricerche.
Il comando more invece può essere usato in combinazione con il comando cat. Questa coppia di comandi aprirà la prima schermata del testo, potremo utilizzare poi il tasto invio per scorrere di una riga o il tasto spazio per scorrere di un’intera schermata. Quando il file sarà finito il comando terminerà e torneremo al prompt della shell.
Wildcards e cat: leggere tutti i file di testo da una cartella
Quando diamo a cat il nome del file da aprire possiamo utilizzare anche le cosiddette wildcards, ovvero dei caratteri speciali che permettono di creare dei pattern che includano potenzialmente più di un file.
Il caso più comune è quello di voler leggere tutti i file di testo dalla directory corrente. Basterà in questo caso usare il comando:
cat *.txt
L’output di questo comando sarà quello di mostrare nella shell tutti i file che finiscono con .txt
Conclusioni
Il comando cat in linux è spesso usato da chi lavora molto con la shell, ma non tutti ne conoscono a fondo tutte le potenzialità. Giunti al termine di questa nostra analisi dovreste saperne abbastanza da poter sfruttare fino in fondo questo semplicissimo ma potentissimo comando.
Se avete dubbi, trovate errori o per qualsiasi altra cosa inserite pure un commento!
Se avete ancora dubbi e l’inglese non vi spaventa potete consultare la pagina man del comando cat.