In questa lezione esploreremo una potente funzionalità, usata da molti
programmi a riga di comando, chiamata redirezione input/output.
Come abbiamo visto, molti comandi come ls
stampano il risultato sullo schermo.
Tuttavia, questo non deve essere l'unico comportamento. Attraverso l'uso
di alcune notazioni speciali possiamo ridirigere l'uscita di molti
comandi verso file, dispositivi e anche verso l'input di altri comandi.
La maggior parte dei programmi a riga di comando che mandano a video i loro risultati, lo fanno inviandoli verso una funzionalità chiamata standard output. Come comportamento predefinito, lo standard output dirige il suo contenuto verso lo schermo; per ridirigere lo standard output verso un file, si usa il carattere ">" nel seguente modo:
[io@linuxbox io]$ ls > lista_file.txt
In questo esempio, viene eseguito il comando ls
e il risultato
è scritto in un file chiamato lista_file.txt. Poich l'uscita di
ls
è stata ridiretta al file, non appare alcun risultato
sullo schermo.
Ogni volta che il comando precedente viene ripetuto, il file lista_file.txt
viene ricreato con l'output del comando ls
. Se invece si vuole che il
nuovo risultato sia accodato alla fine del file, si deve usare ">>" nel
seguente modo:
[io@linuxbox io]$ ls >> lista_file.txt
Quando il risultato è accodato, il nuovo risultato è aggiunto alla fine del file, rendendo così il file sempre più grande ad ogni ripetizione del comando. Se il file non esiste, verrà creato.
Molti comandi possono accettare l'input da una funzionalità chiamata standard input. Come comportamento predefinito, lo standard input ottiene i suoi contenuti dalla tastiera ma, come per lo standard output, può essere ridiretto. Per ridirigere lo standard input da un file invece che dalla tastiera, si usa il carattere "<" nel seguente modo:
[io@linuxbox io]$ sort < lista_file.txt
Nell'esempio precedente, per elaborare il contenuto del file lista_file.txt è stato usato il comando sort. Il risultato è stampato sullo schermo, perché in quest'esempio lo standard output non viene ridiretto. Potremmo ridirigere lo standard output ad un altro file in questo modo:
[io@linuxbox io]$ sort < lista_file.txt > lista_file_ordinata.txt
Come potete vedere, un comando può aver rediretti sia il proprio input, sia il proprio output. Tenete presente che l'ordine della redirezione non è importante. L'unico requisito è che gli operatori di redirezione (i caratteri "<" e ">") appaiano dopo le altre opzioni e gli argomenti del comando.
La cosa più utile ed efficace da fare con la redirezione I/O, è la connessione di più comandi attraverso le cosiddette pipeline. Con le pipeline, lo standard output di un comando vien fatto confluire nello standard input di un altro. Questo esempio è il mio preferito in assoluto:
[io@linuxbox io]$ ls -l | less
In questo esempio, l'output del comando ls
è convogliato nel
comando less
. Con l'uso del trucco "| less" potete permettere
all'utente di scorrere liberamente l'output di qualsiasi comando.
È una tecnica che uso sempre.
Attraverso la connessione di più comandi, si possono compiere imprese sorprendenti. Di seguito ci sono alcuni esempi che potrete provare:
Comando |
Che cosa fa |
ls -lt | head |
Visualizza i 10 file più recenti nella directory corrente. |
du | sort -nr |
Visualizza una lista di directory e quanto spazio consumano, ordinati dalla più grande alla più piccola. |
find . -type f -print | wc -l |
Visualizza il numero totale di file nella directory di lavoro corrente e in tutte le sue sottodirectory. |
Un tipo di programma usato frequentemente usato nelle pipeline è chiamato filtri. I filtri ricevono lo standard input, effettuano un'operazione su di esso e inviano i risultati allo standard output. Possono essere combinati tra di loro per elaborare efficacemente le informazioni. Questi sono alcuni dei programmi più comuni che possono agire come filtri:
Programma |
Che cosa fa |
sort |
Riceve lo standard input e lo invia ordinato allo standard output. |
uniq |
Dato un flusso ordinato di dati dallo standard input, elimina le righe duplicate (assicura, cioè, che ogni riga sia univoca). |
grep |
Esamina tutte le righe di dati che riceve dallo standard input ed emette solo quelle che contengono una combinazione di caratteri specificata |
fmt |
Legge testo dallo standard input e lo emette formattato sullo standard output. |
pr |
Prende testo dallo standard input e lo prepara per la stampa inserendo interruzioni di pagina, intestazioni e note a piè di pagina. |
head |
Emette le prime (poche) righe ricevute dallo standard input. Utile per ottenere l'intestazione di un file. |
tail |
Emette le ultime (poche) righe ricevute dallo standard input. Utile, ad esempio, per ottenere gli ultimi inserimenti in un file di log. |
tr |
Traduce caratteri. Può essere usato per esegure compiti come la conversione maiuscolo/minuscolo o cambiare i caratteri di fine riga da un tipo all'altro (per esempio, la conversione di file di testo DOS in file di testo in stile Unix). |
sed |
Editor di flusso. Può effettuare trasformazioni
di testo più sofisticate rispetto a |
awk |
Un intero linguaggio di programmazione progettato per la costruzione di filtri. Estremamente potente. |
lpr
che riceve lo
standard input e lo invia alla stampante. È usato
spesso con le pipeline e i filtri. Ecco un paio di esempi:
cat report_formattato_male.txt | fmt | pr | lpr
cat lista_non_ordinata_con_duplicati.txt | sort | uniq | pr | lpr
Nel primo esempio, usiamo cat
per leggere il file e
immetterlo sullo standard output, che è convogliato
nello standard input del comando fmt
. fmt
formatta il testo dentro paragrafi stabiliti e lo emette sul suo
standard output, che è convogliato nello standard input
di pr
. pr
divide il testo ordinato in pagine e
lo emette sullo standard output, che è inviato dentro lo
standard input di lpr
. lpr
prende il suo standard
input e lo invia alla stampante.
Il secondo esempio inizia con un lista di dati non ordinata con
linee duplicate. All'inizio, cat
invia la lista dentro
sort
, che la ordina e la invia dentro uniq
;
quest'ultimo rimuove ogni riga duplicata. In seguito, pr
e
lpr
sono rispettivamente usati per impaginare e stampare
la lista.
tar
e compressi con il comando
gzip
, che
tradizionalmente vengono salvati
nelle unità a nastro gestite dai sistemi Unix. Questi file
si possono identificare attraverso le loro tradizionali estensioni:
".tar.gz" o ".tgz". Per vedere il contenuto di questi file su un
sistema Linux, si può usare il comando:
tar tzvf nome_del_file.tar.gz | less