> MENU

Bash, comandi particolari e poco conosciuti: comandi interni alla...

Linux e la linea di comando, comandi particolari e...

12 ottobre 2009 Visualizzazioni: 0 HowTo

Bash, comandi particolari e poco conosciuti: manipolazione di stream e file di testo

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 ScarazziniMiaMammaUsaLinux.org

  • Moro

    Veramente un articolo interessante, grazie.

    • http://www.miamammausalinux.org MiaMammaUsaLinux

      Grazie Moro! Se hai trovato interessante questo articolo, ne esiste anche una prima parte ed a breve ne seguiranno altre due che parlano di altri comandi poco usati, ma utilissimi.

      A presto!

    • Gianvacca

      Grazie mille per questo articolo, utilissimo davvero.

  • MrTsr

    Questi sono comodi comandi di sistema. Cosa c’entra la bash?
    Questi stessi comandi sono utilizzabili anche con le altre shell classiche
    csh, zsh, tcsh etc. etc.

    • http://www.miamammausalinux.org MiaMammaUsaLinux

      Verissimo, ed in effetti sono stato in dubbio sul titolo da dare a questo articolo. Alla fine ho optato per includere comunque la parola “Bash” per soluzione di continuità con l’articolo precedente, in quanto parte di una serie di articoli che ancora deve essere conclusa.

      • MrTsr

        Ok era una scelta da fare, forse visto il taglio pulito e semplice ed efficace dei due articoli, si poteva sottolineare che i comandi esterni sono richiamabili anche dalle altre shell, questo solo per evitare che qualcuno erroneamente possa credere che questi ultimi siano invocabili solo dalla bash o che siano associati ai sorgenti di bash. In ogni caso ribadisco l’ottima impressione che ho avuto dalla lettura dei tuoi elaborati.

  • http://www.kensan.it Sandro kensan

    Carine queste puntate.