Redirezione dell' Input/Output

In questa lezione scopriremo una funzionalità utilizzata da molti programmi a linea di comando: la redirezione dell' Input/Output. Come sappiamo, molti comandi come ls stampano il loro output su video. Ma questa non è l'unica alternativa. Infatti, usando delle speciali direttive è possibile redirigere l'output dei comandi su file, dispositivi ed anche sull'input di altri comandi.

Standard Output

La maggior parte dei programmi a linea di comando che visualizzano su display i risultati lo fanno inviando i risultati su standard output. Per default, lo standard output dirige il contenuto su display. Per redirigere lo standard output su un file si può usare il carattere ">" in questo modo:


[me@linuxbox me]$ ls > file_list.txt


Nell'esempio, viene eseguito il comando ls ed il risultato viene scritto su un file di nome file_list.txt. Dato che il risultato del comando ls è stato spostato su un file, su video non viene visualizzato nulla.

Ogni qualvolta viene eseguito il comando precedente, il file file_list.txt viene sovrascritto (interamente) con il nuovo output del comando ls. Se si vuole che il risultato del comando venga piuttosto appeso al file (cioè aggiunto alla fine del file) bisogna usare il carattere ">>" come mostrato nell'esempio:


[me@linuxbox me]$ ls >> file_list.txt


In questo modo i nuovi risultati vengono appesi (alla fine del) file, che pertanto risulta più lungo ogni volta che il comando viene ri-eseguito. Se il file non esiste nel momento in cui si cerca di appendere l'output, (il file) viene creato.

Standard Input

Molti comandi possono prendere degli input acquisendoli da standard input. Per default, lo standard input accetta il contenuto dalla tastiera, ma così come visto per lo standard output, anche lo standard input può essere rediretto. Per redirigere lo standard input su file piuttosto che su tastiera bisogna usare il carattere "<" nel seguente modo:


[me@linuxbox me]$ sort < file_list.txt


Nell'esempio precedente abbiamo usato il comando sort per processare il contenuto del file_list.txt. I risultati vengono dati in output sul video dato che lo standard output non è rediretto. Ma si potrebbe redirigere anche lo standard output su un altro file, come nell'esempio seguente:


[me@linuxbox me]$ sort < file_list.txt > sorted_file_list.txt


Come si vede, un comando può avere sia l'input che l'output rediretti. L'ordine dei comandi di redirezione non è rilevante. L'unico requisito è che gli operatori di redirezione ("<" e ">") appaiano dopo le altre opzioni o argomenti del comando.

Pipes

Una delle cose più utili e interessanti che si possono fare con la redirezione dell' I/O è combinare tra loro comandi multipli, utilizzando ciò che si chiama pipe. Con le pipes, lo standard output di un comando può essere concatenato ed usato come standard input di un altro. Per esempio:


[me@linuxbox me]$ ls -l | less


In questo caso, l'output del comando ls è spostanto nell'input di less. Usando "| less", è possibile avere più informaziioni sull'output di un comando.

Concatenando insieme dei comandi, si possono ottenere risultati interessanti. Seguono alcuni esempi:

E sempi di comandi usati insieme con le pipes
Comando 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 occupano, ordinandole dalla più grande alla più piccola.

find . -type f -print | wc -l

Visualizza il numero totale di file nella directory corrente e tutte le sue sottodirectory.

Filtri

I filtri sono una classe di programmi che si possono usare con le pipes. Un filtro prende lo standard input, effettua una operazione su di esso ed invia il risultato su standard output. Perciò i filtri si possono usare per processare informazioni. Seguono alcuni comuni programmi che possono agire come filtri:

Comandi di filtri
Programma Cosa fa

sort

Ordina standard input e poi restituisce il risultato ordinato su standard output.

uniq

Dato un flusso di dati ordinato da standard input, rimuove le linee di dati duplicati (ad esempio, fa si che ogni linea sia unica).

grep

Esamina ogni linea di dati che riceve da standard input e restituisce ogni linea contenente uno specifico pattern di caratteri.

fmt

Legge il testo da standard input e restituisce il testo formattato su standard output.

pr

Prende in input un testo da standard input e suddivide i dati in pagine con interruzioni di page, headers e footers in previsione di una stampa.

head

Restitisce le prime righe dell'input. E' utile per ottenere l'header di un file.

tail

Restituisce le ultime linee di un input. E' utile per prendere le entries più recenti da un file di log.

tr

Transla dei caratteri. Può essere usato per convertire i caratteri da maiuscolo/minuscolo o cambiare i caratteri di terminazione di linea da un tipo ad un altro (ad esempio, convertire file di testo DOS in file di testo in stile Unix).

sed

Editor di stream. Può effettuare traslazioni di testi più sofisticate di tr.

awk

Un intero linguaggio di programmazione usato per costruire filtri. Molto potente.



 

Per i più curiosi: lts0060.html


 

 



© 2000-2002, William Shotts, Jr. Verbatim copying and distribution of this entire article is permitted in any medium, provided this copyright notice is preserved.