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