Amministratore Linux: comando cat

Il catviene utilizzato per concatenare i file e stampare sull'output standard. In precedenza, abbiamo dimostrato usi e abusi con il comando cat. cat serve i seguenti scopi distinti:

  • Mostra i contenuti dei file

  • Scrive il contenuto di un file in un altro file

  • Combina più file in un unico file

  • Supporta funzioni speciali: aggiunta di numeri di riga, visualizzazione di caratteri speciali, eliminazione di righe vuote

Interruttore Azione
-b Numero di righe non vuote
-E Mostra le estremità della linea
-T Mostra schede
-S Schiaccia gli spazi vuoti, elimina le righe vuote ripetute

Come notato in precedenza, quando si usano utilità come grep , sort e uniq , si vuole evitare, se possibile, il piping dell'output da cat. Lo abbiamo fatto per una semplice dimostrazione dei comandi di piping in precedenza. Tuttavia, sapere quando eseguire un'operazione con un'utilità come grep è ciò che separa gli amministratori Linux dagli utenti finali Linux.

Cattiva abitudine

[[email protected] centos]# cat /etc/passwd | sort -t: -k1  | grep ":0" 
halt:x:7:0:halt:/sbin:/sbin/halt 
operator:x:11:0:operator:/root:/sbin/nologin 
root:x:0:0:root:/root:/bin/bash 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 
sync:x:5:0:sync:/sbin:/bin/sync 
[[email protected] centos]#

Buona abitudine

[[email protected] centos]# grep ":0" /etc/passwd | sort -t: -k 1  
halt:x:7:0:halt:/sbin:/sbin/halt 
operator:x:11:0:operator:/root:/sbin/nologin 
root:x:0:0:root:/root:/bin/bash 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 
sync:x:5:0:sync:/sbin:/bin/sync 
[[email protected] centos]#

Note - il piping cat a comandi secondari come sort o grep dovrebbe essere fatto solo quando è necessario.

Un uso comune di cat è quando si ha a che fare con interruzioni di riga formattate Windows. Sia Linux che Windows per progettazione interna, utilizzano un codice di controllo diverso per rappresentare End Of Line (EOL) -

* Linux line break is always a Line Feed: LF or depicted as "\n". 
* Windows is Carriage Return followed by a Line Feed: CR LF or depicted as "\r\n".
* Macintosh, in all moderne releases of OS X and now macOS, has adopted the Linux/Unix 
standard of LF or "\n"

Quindi, supponiamo di aprire il nostro file in un editor di testo GUI come gedit o di riscontrare problemi casuali durante l'applicazione dei comandi di filtro. Il testo viene visualizzato su una singola riga oppure i comandi di filtro non funzionano come previsto.

In particolare, quando il file di testo è stato scaricato da Internet, vogliamo controllare le interruzioni di riga. Di seguito è riportato un esempio di output da cat che mostra i caratteri EOL.

[[email protected] centos]# cat -E  ./Desktop/WinNames.txt  
 $ed:Daniel:101 
 $enny:Colon:608 
 $ana:Maxwell:602 
 $arian:Little:903 
 $obbie:Chapman:403 
 $icolas:Singleton:203 
 $ale:Barton:901

Notare il precedente "$"su ogni riga? Linux sta leggendo la CR" \ n ", interrompendo il file. Quindi traduce un ritorno a capo sul primo carattere di ogni file.

Se visualizzato senza l'opzione -E, il file sembra a posto -

[[email protected] centos]# cat  ./Desktop/WinNames.txt  
 Ted:Daniel:101 
 Jenny:Colon:608 
 Dana:Maxwell:602 
 Marian:Little:903 
 Bobbie:Chapman:403 
 Nicolas:Singleton:203 
 Dale:Barton:901

Fortunatamente, con i comandi di filtraggio di Linux questa è una soluzione semplice:

[[email protected] centos]# sed -i 's/\r$//g' ./Desktop/WinNames.txt  
[[email protected] centos]# cat -E ./Desktop/WinNames.txt  
Ted:Daniel:101$ 
Jenny:Colon:608$ 
Dana:Maxwell:602$

Note - Se visualizzati con l'opzione -E, tutte le interruzioni di riga di Linux finiranno in $.

cat può essere utilizzato anche per combinare più file in un unico file.

[[email protected] centos]# cat linux.txt  
CentOS 
Ubuntu 
Red Hat 
Suse 
Debian 
[[email protected] centos]# cat windwos.txt  
NT 3.5 
NT 4.0 
Server 2000 
Server 2003 
Server 2008 
Server 2012 
Server 2016 
[[email protected] centos]#

Usiamo ora cat per combinare i due file.

[[email protected] centos]# cat windwos.txt linux.txt > server_class_operating_sytems.txt 
[[email protected] centos]# cat server_class_operating_sytems.txt  
NT 3.5 
NT 4.0 
Server 2000 
Server 2003 
Server 2008 
Server 2012 
Server 2016 
CentOS 
Ubuntu 
Red Hat 
Suse 
Debian 
[[email protected] centos]#

Infine, possiamo usare il file -npassare al numero di ciascuna linea di uscita. Questo ci darà un totale di righe.

[[email protected] centos]# cat -n ./server_class_operating_sytems.txt  
 1  NT 3.5 
 2  NT 4.0 
 3  Server 2000 
 4  Server 2003 
 5  Server 2008 
 6  Server 2012 
 7  Server 2016 
 8  CentOS 
 9  Ubuntu 
10  Red Hat 
11  Suse 
12  Debian [[email protected] centos]#