Avanti Indietro Indice

7. Lezione 6 - Redirezione I/O

7.1 Redirezione I/O

In questa lezione esploreremo una potente funzionalità, usata da molti programmi della riga di comando, chiamata redirezione input/output. Come abbiamo visto, molti comandi come ls stampano la loro uscita sullo schermo, che però non sempre fa al caso nostro. Attraverso l'uso di qualche notazione speciale possiamo ridirigere l'uscita di molti comandi verso file, dispositivi e anche all'ingresso di altri comandi.

7.2 Standard Output

La maggior parte dei programmi a riga di comando che mandano a video i loro risultati, lo fanno inviandoli verso una facilità 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. Quando l'uscita di ls è 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 vuoi che il nuovo risultato sia accodato alla fine del file, usa ">>" 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, sarà creato.

7.3 Standard Input

Molti comandi possono accettare l'input da una facilità 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 si usa 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 puoi vedere, un comando può aver rediretti sia il proprio input, sia il proprio output. Assicurati che l'ordine della redirezione non sia importante. L'unico requisito è che gli operatori di redirezione (i caratteri "<" e ">") appaiano dopo le altre opzioni e gli argomenti del comando.

7.4 Le Pipe

La cosa più efficace e utile da fare con la redirezione I/O, è la connessione di più comandi attraverso le cosiddette pipe. Con le pipe, lo standard output di un comando viene convogliato dentro lo 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" puoi 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 potrai provare:

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.

7.5 I Filtri

Una classe di programmi che puoi usare con le pipe è chiamata filtri. I filtri ricevono lo standard input, realizzano un'operazione su di esso e inviano i risultati allo standard output. In questo modo, possono essere usati per elaborare efficacemente le informazioni. Ecco alcuni dei programmi più comuni che possono agire come filtri:

sort

Riceve lo standard input e lo invia ordinato allo standard output.

uniq

Dato un flusso ordinato di dati dallo standard input, elimina le linee duplicate (assicura, cioè, che ogni linea sia univoca).

grep

Esamina tutte le linee di dati che riceve dallo standard input ed emette solo quelle che rispettano un modello di caratteri specificato.

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 fondo pagina.

head

Emette le prime (poche) linee ricevute dallo standard input. Utile per ottenere l'intestazione di un file.

tail

Emette le ultime (poche) linee ricevute dallo standard input. Utile, ad esempio, per ottenere gli ultimi inserimenti in un file di log.

tr

Traduce caratteri. Può essere usato per realizzare compiti come la conversione maiuscolo/minuscolo o cambiare i caratteri di fine linea 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ò realizzare trasformazioni di testo più sofisticate rispetto a tr.

awk

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

7.6 Svolgere attività con le pipe

  1. Stampare dalla riga di comando. Linux fornisce un programma chiamato lpr che riceve lo standard input e lo invia alla stampante. È usato spesso con le pipe 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 ed emetterlo sullo standard output, dal quale è incanalato dentro lo standard input del comando fmt. fmt formatta il testo dentro paragrafi stabiliti e lo emette sul suo standard output, che è inviato dentro lo 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. Noterai 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, puoi usare il comando:
           tar tzvf nome_del_file.tar.gz | less
           
    


Avanti Indietro Indice