Come usare i comandi cat e tac di Linux

I comandi cat e tac visualizzano il contenuto dei file di testo, ma c’è molto di più di quanto sembri. Immergiti un po ‘più a fondo e impara alcuni trucchi produttivi della riga di comando di Linux.

Questi sono due semplici piccoli comandi, spesso liquidati come se fossero proprio questo: troppo semplici per essere di reale utilità. Ma una volta che conosci i diversi modi in cui puoi usarli, vedrai che sono perfettamente in grado di fare la loro giusta parte del lavoro pesante quando si tratta di lavorare con i file.

Il gatto Command

il gatto è abituato esaminare il contenuto dei file di testoe per unire parti di file insieme per formare un file più grande.

Un tempo, nell’era del dial-up modem—I file binari venivano spesso suddivisi in diversi file più piccoli per facilitare il download. Invece di scaricare un file di grandi dimensioni, hai ritirato ogni file più piccolo. Se un singolo file non è stato scaricato correttamente, dovresti semplicemente recuperare quel file di nuovo.

Ovviamente, era quindi necessario un modo per ricostituire la raccolta di file più piccoli nel singolo file binario di lavoro. Quel processo è stato chiamato concatenazione. Ed è qui che entra in gioco il gatto e da dove prende il nome.

Le connessioni a banda larga e in fibra hanno causato la dissolvenza di quella particolare esigenza, proprio come i suoni stridenti di dial-up, quindi cosa resta da fare per gatto oggi? Un bel po ‘in realtà.

Visualizzazione di un file di testo

Per fare in modo che cat elenchi il contenuto di un file di testo in una finestra di terminale, utilizzare il seguente comando.

Assicurati che il file sia un file di testo. Se provi a elencare il contenuto di un file binario nella finestra del terminale, i risultati saranno imprevedibili. Potresti finire con una sessione terminale bloccata o peggio.

cat poem1.txt

cat poem1.txt in una finestra di terminale

Il contenuto del file poem1.txt viene mostrato nella finestra del terminale.

il contenuto di poem1.txt in una finestra di terminale

Questa è solo la metà della famosa poesia. Dov’è il resto? C’è un altro file qui chiamato poem2.txt. Possiamo fare in modo che cat list il contenuto di più file con un comando. Tutto quello che dobbiamo fare è elencare i file in ordine sulla riga di comando.

cat poem1.txt poem2.txt

cat poem1.txt poem2.txt in una finestra di terminale

Sembra migliore; ora abbiamo l’intera poesia.

contenuto di poem1.txt e poem2.txt in una finestra di terminale

Usare il gatto con meno

La poesia è tutta lì, ma è passata davanti alla finestra troppo velocemente per leggere i primi versi. Possiamo convogliare l’output di cat in less e scorrere il testo al nostro ritmo.

cat poem1.txt poem2.txt | less

cat poem1.txt poem2.txt |  meno in una finestra di terminale

Ora possiamo spostarci avanti e indietro nel testo in un flusso, anche se è contenuto in due file di testo separati.

  Come giocare a Just Cause 3 su Linux

contenuto di poem1.txt e poem2.txt in less in una finestra di terminale

Numerazione delle linee in un file

Possiamo avere il numero di gatto delle righe nel file così come viene visualizzato. Per fare ciò, usiamo l’opzione -n ​​(numero).

cat -n poem1.txt

cat -n poem1.txt in una finestra di terminale

Le righe sono numerate così come vengono visualizzate nella finestra del terminale.

contenuto di poem1.txt con righe numerate in una finestra di terminale

Non numerare le righe vuote

Siamo riusciti a numerare le righe per gatto, ma vengono contate anche le righe vuote tra i versi. Per avere le righe di testo numerate ma per ignorare le righe vuote, usa l’opzione -b (number-nonblank).

cat -b poem1.txt

cat -b poem1.txt in una finestra di terminale

Ora le righe di testo sono numerate e le righe vuote vengono saltate.

righe numerate che saltano l; ines vuote in una finestra di terminale

Non mostrare più righe vuote

Se ci sono sezioni di righe vuote consecutive in un file, possiamo chiedere a cat di ignorare tutte le righe vuote tranne una. Guarda questo file.

contenuto di un file con righe vuote consecutive in una finestra di terminale

Il comando successivo farà sì che cat visualizzi solo una riga vuota da ogni gruppo di righe vuote. L’opzione di cui abbiamo bisogno per ottenere questo risultato è l’opzione -s (squeeze-blank).

cat -s poem1.txt

cat -b poem1.txt in una finestra di terminale

Ciò non influisce in alcun modo sul contenuto del file; cambia solo il modo in cui cat visualizza il file.

Più righe vuote vengono ignorate in una finestra di terminale

Schede di visualizzazione

Se vuoi sapere se gli spazi bianchi sono causati da spazi o tabulazioni, puoi scoprirlo usando l’opzione -T (mostra-tabs).

cat -T poem1.txt

cat -T poem1.txt in una vedova terminale

Le schede sono rappresentate dai caratteri “^ I”.

contenuto di poema1.txt con le schede visualizzate in una finestra di terminale

Visualizzazione delle estremità delle righe

È possibile verificare la presenza di spazi vuoti finali utilizzando l’opzione -E (show-end).

cat -E poem1.txt

cat -T poem1.txt in una finestra di terminale

Le estremità delle righe sono rappresentate dal carattere “$”.

contenuto di poem1.txt con le estremità della riga visualizzate in una finestra di terminale

File concatenati

Non ha senso salvare una poesia in due file, con una metà in ciascuno. Uniamoli insieme e creiamo un nuovo file con l’intera poesia al suo interno.

cat poem1.txt poem2.txt > jabberwocky.txt

cat poem1.txt poem2.txt> jabberwocky.txt in una finestra di terminale “width =” 646 ″ height = “57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = “this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> usiamo cat per controllare il nostro nuovo file: </p>
<pre> cat jabberwocky.txt </ pre > <p> <img loading =

Il nostro nuovo file contiene il contenuto degli altri due file.

contenuto di jabberwocky.tx in una finestra di terminale

Aggiunta di testo a un file esistente

Così va meglio, ma in realtà non è l'intera poesia. Manca l'ultimo verso. L'ultimo verso in Jabberwocky è lo stesso del primo verso.

Se abbiamo il primo verso in un file, possiamo aggiungerlo alla fine del file jabberwocky.txt e avremo la poesia completa.

In questo prossimo comando, dobbiamo usare >>, non solo>. Se usiamo un singolo> sovrascriveremo jabberwocky.txt. Non vogliamo farlo. Vogliamo aggiungere del testo alla fine di esso.

cat first_verse.txt >> jabberwocky.txt

cat first_verse.txt >> jabberwocky.txt in una finestra di terminale

Controlliamo il contenuto del file jabberwocky.txt:

 cat jabberwocky.txt < / pre> 

E infine, tutte le parti della poesia sono insieme.

contenuto di jabberwocky.txt in una finestra di terminale

Reindirizzamento stdin

Puoi reindirizzare l'input dalla tastiera in un file usando cat. Tutto ciò che digiti viene reindirizzato nel file finché non premi Ctrl + D. Nota che usiamo un singolo> perché vogliamo creare il file (o sovrascriverlo, se esiste).

cat > my_poem.txt

cat> my_poem.txt in una finestra di terminale

Possiamo iniziare a digitare non appena emettiamo il comando. Premiamo Ctrl + D quando abbiamo finito. Possiamo quindi controllare il contenuto del nuovo file con:

 cat my-poem.txt 

Quel suono come una turbina lontana è probabilmente Lewis Carroll che gira nella sua tomba ad alta velocità.

Il comando tac

tac è simile a cat, ma elenca il contenuto dei file in ordine inverso.

Vediamo che:

tac my_poem.txt

tac my_poem.txt in una finestra di terminale

E il file viene elencato nella finestra del terminale in ordine inverso. In questo caso, non ha alcun effetto sui suoi meriti letterari.

my_poem.txt elencato in ordine inverso in una finestra di terminale

Usare tac con stdin

L'uso di tac senza un nome file lo farà funzionare sull'input dalla tastiera. Premendo Ctrl + D si interromperà la fase di input e tac elencherà in ordine inverso qualunque cosa tu abbia digitato.

tac

tac lavorare con stdin in una finestra di terminale

Quando si preme Ctrl + D, l'input viene invertito ed elencato nella finestra del terminale.

output da tac usando stdin in una finestra di terminale

Utilizzo di tac con i file di registro

A parte i trucchi da salotto di basso livello, può tac fare qualcosa di utile? Sì, può. Molti file di registro aggiungono le loro voci più recenti alla fine del file. Usando tac (e, controintuitivamente, head) possiamo far apparire l'ultima voce nella finestra del terminale.

Usiamo tac per elencare il file syslog al contrario e inserirlo in head. Dicendo a head di stampare solo la prima riga che riceve (che grazie a tac è l'ultima riga del file), vediamo l'ultima voce nel file syslog.

tac /var/log/syslog | head -1

tac / var / log / syslog |  testa -1 in una finestra di terminale

head stampa l'ultima voce dal file syslog e quindi esce.

Notare che head stampa solo una riga, come richiesto, ma la riga è così lunga che si avvolge due volte. Ecco perché sembrano tre righe di output nella finestra del terminale.

ultima voce da syslog in una finestra di terminale

Utilizzo di tac con i record di testo

L'ultimo trucco che tac ha nella manica è una bellezza.

Di solito, tac opera su file di testo facendoli scorrere riga per riga, dal basso verso l'alto. Una riga è una sequenza di caratteri terminata da un carattere di nuova riga. Ma possiamo dire a tac di lavorare con altri delimitatori. Questo ci consente di trattare "blocchi" di dati all'interno del file di testo come record di dati.

Supponiamo di avere un file di registro di un programma che dobbiamo rivedere o analizzare. Diamo un'occhiata al suo formato con meno.

less logfile.dat

meno file di log in una finestra di terminale

Come possiamo vedere, c'è un formato ripetuto per il file. Ci sono sequenze di tre righe di esadecimale valori. Ciascun gruppo di tre righe esadecimali ha una riga dell'etichetta che inizia con "= SEQ", seguita da una sequenza di cifre.

parte superiore del file di registro in una finestra di terminale

Se scorriamo fino alla fine del file, possiamo vedere che ci sono molti di questi record. L'ultima è numerata 865.

parte inferiore del file di registro in una finestra di terminale

Supponiamo che per qualsiasi motivo abbiamo bisogno di lavorare su questo file in ordine inverso, record di dati per record di dati. L'ordine delle tre righe esadecimali in ogni record di dati deve essere mantenuto.

Prenderemo nota che le ultime tre righe del file iniziano con i valori esadecimali 93, E7 e B8, in quest'ordine.

Usiamo tac per invertire il file. È un file molto lungo, quindi lo inseriremo in less.

tac logfile.dat | less

tac logfile.dat |  meno in una finestra di terminale

Ciò inverte il file, ma non è il risultato che vogliamo. Vogliamo che il file venga invertito, ma le righe in ogni record di dati devono essere nell'ordine originale.

file di log invertito in less in una finestra di terminale

Abbiamo registrato in precedenza che le ultime tre righe del file iniziano con valori esadecimali 93, E7 e B8, in quest'ordine. L'ordine di quelle righe è stato invertito. Inoltre, le linee "= SEQ" sono ora sotto ogni gruppo di tre linee esadecimali.

tac in soccorso.

tac -b -r -s ^=SEQ.+[0-9]+*$ logfile.dat | less

tac -b -r -s ^ = SEQ. +[0-9]+ * $ logfile.dat |  meno in una finestra di terminale

Analizziamolo.

L'opzione -s (separatore) informa tac cosa vogliamo usare come delimitatore tra i nostri record. Dice a tac di non usare il suo solito carattere di nuova riga, ma di usare invece il nostro separatore.

L'opzione -r (regex) dice a tac di trattare la stringa separatrice come un file espressione regolare.

L'opzione -b (prima) fa sì che tac elenchi il separatore prima di ogni record invece che dopo di esso (che è la posizione usuale del suo separatore predefinito, il carattere di nuova riga).

La stringa -s (separatore) ^ = SEQ. +[0-9]+ * $ viene decifrato come segue:

Il carattere ^ rappresenta l'inizio della riga. Questo è seguito da = SEQ. +[0-9]+ * $. Questo indica a tac di cercare ogni occorrenza di "= SEQ". all'inizio di una riga, seguita da qualsiasi sequenza di cifre (indicata da [0-9]) e seguito da qualsiasi altro set di caratteri (indicato da * $).

Stiamo convogliando l'intero lotto in meno, come al solito.

file di registro invertito con record di dati formati correttamente

Il nostro file viene ora presentato in ordine inverso con ciascuna riga dell'etichetta "= SEQ" elencata prima delle sue tre righe di dati esadecimali. Le tre righe di valori esadecimali sono nell'ordine originale all'interno di ogni record di dati.

Possiamo verificarlo semplicemente. Il primo valore delle prime tre righe esadecimali (che erano le ultime tre righe prima che il file fosse invertito) corrisponde ai valori che abbiamo registrato in precedenza: 93, E7 e B8, in quest'ordine.

Questo è un bel trucco per una finestra di terminale.

Tutto ha uno scopo

Nel mondo Linux, anche i comandi e le utilità apparentemente più semplici possono avere proprietà sorprendenti e potenti.

La filosofia progettuale di semplici utilità che fa bene una cosa, e che interagiscono facilmente con altre utilità, ha dato origine ad alcuni strani piccoli comandi, come tac. A prima vista, sembra essere un po 'una stranezza. Ma quando scruti sotto la superficie, c'è un potere inaspettato che puoi sfruttare a tuo vantaggio.

O, come dice un'altra filosofia: "Non disprezzare il serpente per non avere le corna, perché chi può dire che non diventerà un drago?"