Unix / Linux: pipe e filtri
In questo capitolo, discuteremo in dettaglio di pipe e filtri in Unix. È possibile collegare due comandi insieme in modo che l'output di un programma diventi l'input del programma successivo. Due o più comandi collegati in questo modo formano una pipe.
Per fare una pipa, metti una barra verticale (|) sulla riga di comando tra due comandi.
Quando un programma prende l'input da un altro programma, esegue alcune operazioni su quell'input e scrive il risultato sullo standard output. È indicato come afilter.
Il comando grep
Il comando grep cerca uno o più file per le righe che hanno un certo modello. La sintassi è:
$grep pattern file(s)
Il nome "grep" proviene dal comando ed (un editor di riga Unix) g/re/p che significa "cercare globalmente un'espressione regolare e stampare tutte le righe che la contengono".
Un'espressione regolare è un testo semplice (una parola, ad esempio) e / o caratteri speciali utilizzati per la corrispondenza dei modelli.
L'uso più semplice di grep è cercare un pattern composto da una singola parola. Può essere utilizzato in una pipe in modo che solo quelle righe dei file di input contenenti una data stringa vengano inviate allo standard output. Se non date a grep un nome di file da leggere, legge il suo standard input; è così che funzionano tutti i programmi di filtro -
$ls -l | grep "Aug"
-rw-rw-rw- 1 john doc 11008 Aug 6 14:10 ch02
-rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07
-rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro
-rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros
$
Ci sono varie opzioni che puoi usare insieme a grep comando -
Sr.No. | Opzione e descrizione |
---|---|
1 | -v Stampa tutte le righe che non corrispondono al modello. |
2 | -n Stampa la riga corrispondente e il relativo numero di riga. |
3 | -l Stampa solo i nomi dei file con righe corrispondenti (lettera "l") |
4 | -c Stampa solo il conteggio delle righe corrispondenti. |
5 | -i Corrisponde a lettere maiuscole o minuscole. |
Usiamo ora un'espressione regolare che dice a grep di trovare le linee con "carol", seguito da zero o da altri caratteri abbreviati in un'espressione regolare come ". *"), quindi seguito da "ago". -
Qui stiamo usando il -i opzione per la ricerca senza distinzione tra maiuscole e minuscole -
$ls -l | grep -i "carol.*aug"
-rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros
$
Il comando di ordinamento
Il sortIl comando dispone le righe di testo in ordine alfabetico o numerico. L'esempio seguente ordina le righe nel file di cibo:
$sort food
Afghani Cuisine
Bangkok Wok
Big Apple Deli
Isle of Java
Mandalay
Sushi and Sashimi
Sweet Tooth
Tio Pepe's Peppers
$
Il sortIl comando dispone le righe di testo in ordine alfabetico per impostazione predefinita. Ci sono molte opzioni che controllano l'ordinamento:
Sr.No. | Descrizione |
---|---|
1 | -n Ordina numericamente (esempio: 10 ordinerà dopo 2), ignora gli spazi e le tabulazioni. |
2 | -r Inverte l'ordine di ordinamento. |
3 | -f Ordina insieme maiuscole e minuscole. |
4 | +x Ignora prima x campi durante l'ordinamento. |
Più di due comandi possono essere collegati in una pipe. Prendendo un esempio di pipe precedente usandogrep, possiamo ulteriormente ordinare i file modificati in agosto in base all'ordine di dimensione.
La seguente pipe è composta dai comandi ls, grep, e sort -
$ls -l | grep "Aug" | sort +4n
-rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros
-rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro
-rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07
-rw-rw-rw- 1 john doc 11008 Aug 6 14:10 ch02
$
Questa pipe ordina tutti i file nella directory modificata ad agosto in base alla dimensione e li stampa sullo schermo del terminale. L'opzione di ordinamento + 4n salta quattro campi (i campi sono separati da spazi) quindi ordina le righe in ordine numerico.
I comandi pg e altri
Un output lungo può normalmente essere zippato da te sullo schermo, ma se fai scorrere più testo o usi il file pgcomando come filtro; il display si ferma quando lo schermo è pieno di testo.
Supponiamo che tu abbia un lungo elenco di directory. Per semplificare la lettura dell'elenco ordinato, convogliare l'outputmore come segue -
$ls -l | grep "Aug" | sort +4n | more
-rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros
-rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro
-rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07
-rw-rw-r-- 1 john doc 14827 Aug 9 12:40 ch03
.
.
.
-rw-rw-rw- 1 john doc 16867 Aug 6 15:56 ch05
--More--(74%)
Lo schermo si riempirà quando lo schermo sarà pieno di testo composto da righe ordinate in base alla dimensione del file. Nella parte inferiore dello schermo c'è il filemore prompt, dove è possibile digitare un comando per spostarsi nel testo ordinato.
Una volta che hai finito con questa schermata, puoi usare uno qualsiasi dei comandi elencati nella discussione del programma more.