Nel primo articolo di questa serie sono stati affrontati i comandi interni alla shell Bash che permettono di agevolare il proprio lavoro ed ottimizzarne le tempistiche di realizzazione. In questa nuova puntata verranno trattati comandi di sistema, generalmente ignorati, richiamabili all’interno della shell Bash per la manipolazione degli stream di output e dei contenuti dei file.
Comandi per l’elaborazione degli stream di testo
Lo studio del contenuto dei file, dal filtro dei contenuti all’ordinamento di questi sono operazioni effettuate quotidianamente attraverso diffusissimi comandi come cat, grep e sort. Ma esiste un nutrito numero di comandi utilizzabili per l’elaborazione dei così detti “stream” di testo, eccone descritti alcuni.
tac
Il funzionamento di tac è quello dell’esatto opposto di cat. Esso infatti concatena e stampa il contenuto dei file in ordine inverso, partendo cioè dall’ultima riga. Supponendo di avere il seguente file di testo:
$ cat elenco 1 2 3 4 5 6
l’output generato da tac sarà il seguente:
$ tac elenco 6 5 4 3 2 1
tr
Il comando tr permette di modificare o cancellare caratteri da uno stream di input. Dato ad esempio il file contenente l’elenco precedente, sarà possibile ad esempio sostituire i caratteri newline (accapo) con il carattere “#”, utilizzando il comando in questa forma:
$ cat elenco_num | tr "\n" "#" 1#2#3#4#5#6#
L’opzione “-d” del comando consente di eliminare e non sostituire le occorrenze trovate, applicato al comando precedente, correggerebbe l’output come segue:
$ cat elenco | tr "\n" "#" | tr -d "#" 12345678910
tr permette di utilizzare anche specifici set di caratteri, senza che ne venga indicato uno specifico. Ad esempio dato il seguente file di testo:
$ cat elenco A B C D E F
è possibile convertire tutte le lettere maiuscole in minuscole attraverso l’utilizzo dei seguenti set:
$ cat elenco | tr "[:upper:]" "[:lower:]" a b c d e f
L’elenco completo dei set di caratteri utilizzabili si trova nella man page del comando.
nl
nl consente di numerare le righe proveniente da uno stream di input. La forma in cui la numerazione appare dipende dalle opzioni passate, senza alcuna opzione il comando numererà le righe con gli indici allineati a destra:
$ cat elenco | nl 1 A 2 B 3 C 4 D 5 E 6 F
è possibile specificare un formato diverso per l’indice di riga attraverso l’opzione “-n”, ad esempio per fare in modo che gli indici siano allineati a sinistra l’opzione da passare sarà “-n ln”, mentre per lasciare gli indici allineati a destra e fare in modo che gli spazi precedenti siano riempiti da zero l’opzione sarà “-n rz”.
E’ possibile specificare anche il carattere di separazione tra l’indice e la riga associata, che di default è tab, con un altro carattere attraverso l’opzione “-s”.
Ecco un esempio:
$ cat elenco | nl -n rz -s "#" 000001#A 000002#B 000003#C 000004#D 000005#E 000006#F
paste
Il comando paste permette di unire due file riga per riga. Nell’esempio più banale paste è utilizzato come segue:
$ paste elenco elenco_num A 1 B 2 C 3 D 4 E 5 F 6
ed anche per questo comando è possibile sostituire con l’opzione “-d” il carattere che separa le righe, di default sempre tab, con un carattere a scelta:
$ paste -d "#" elenco elenco_num A#1 B#2 C#3 D#4 E#5 F#6
paste può essere utilizzato per operare anche su stream di input in modo da unire le righe prodotte ad un’elaborazione a quelle di un file:
$ tac elenco|paste - elenco F A E B D C C D B E A F
lo stream generato dal comando tac viene utilizzato da paste attraverso l’introduzione del carattere “-” per ottenere l’unione di tutte le righe del file con quelle dello stesso, ma contrapposte.
wc
wc effettua un conteggio e totalizza a seconda delle opzioni il numero di caratteri (”-m”), parole (”-w”), byte (”-c”) e linee (”-l”) di un file o di uno stream di input. Ad esempio per conoscere il numero di file nascosti presente in una directory, sarà sufficiente utilizzare il comando come segue:
$ ls .* | wc -l 681
Lanciato senza argomenti wc restituisce tre valori: il numero di linee, di parole e di byte. Ad esempio nel caso di un calcolo su due file il comportamento del comando sarà il seguente:
$ wc elenco elenco_num 6 6 12 elenco 6 6 12 elenco_num 12 12 24 totale
tee
Il comando tee permette di redirigere l’output di un comando all’interno di un file e nel contempo stamparlo a video. Mentre la ridirezione classica effettuata attraverso il carattere “>” non permette di consultare istantaneamente l’output, attraverso tee è possibile osservare riproporre il flusso output del comando lanciato ed al contempo salvarlo in un file:
$ tac elenco | tee elenco_inv | wc -l 6
L’esempio dimostra la peculiarità del comando tee: lo stream di output viene registrato all’interno del file elenco_inv e passato al comando wc che ne calcola il numero di righe.
Conclusioni
Chiaramente ciascuno dei comandi illustrati possiede numerosi altri parametri che ne alterano il funzionamento, questi sono consultabili attraverso le man page sempre complete e prodighe di importanti informazioni. Scopo di questa serie di articoli rimane quello di fornire spunti dietro i quali approfondire. Nel prossimo articolo verranno affrontati i comandi utilizzabili per la gestione delle code di stampa da linea di comando.
di Raoul Scarazzini – MiaMammaUsaLinux.org