Avanti Indietro Indice

7. Lezione 7 - Redirezione I/O

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.

7.1 Standard Output

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.

7.2 Standard Input

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.

7.3 Le Pipeline

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.

Esempi di comandi usati insieme con le pipeline

7.4 I Filtri

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 tr.

awk

Un intero linguaggio di programmazione progettato per la costruzione di filtri. Estremamente potente.

Comandi filtro comuni

7.5 Svolgere attività con le pipeline

  1. Stampare dalla riga di comando. Linux dispone di un programma chiamato 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.

  2. Vedere il contenuto di file tar. Noterete che, spesso, il software è distribuito nella forma file.tar.gz, un formato di archivio per i file creati con il comando 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
    


Avanti Indietro Indice