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.