Guida avanzata a Solaris

Capitolo 4 Operazioni di ricerca

In questo capitolo viene descritto come ricercare all'interno di file o directory determinate stringhe o parole chiave utilizzando il comando grep di SunOS.

Ricerca di stringhe di caratteri con grep

Per ricercare una determinata stringa di caratteri in un file si utilizza il comando grep. La sintassi generale di grep è la seguente:

$ grep stringa file

dove stringa è la parola o la frase da ricercare e file è il nome del file nel quale deve essere eseguita la ricerca.


Nota -

Una stringa è una sequenza di uno o più caratteri; può essere perciò una lettera singola, una parola o una frase. Le stringhe possono includere "spazi vuoti", segni di interpunzione e caratteri invisibili (di controllo).


Per ricercare ad esempio l'interno telefonico di Edgar Allan Poe, occorre digitare grep, il nome da ricercare in forma completa o parziale e il file che contiene l'informazione:

$ grep Poe interni
Edgar Allan Poe     x72836
$

Si noti che grep può individuare più righe corrispondenti al modello di ricerca impostato:

$ grep Allan interni
David Allan         x76438
Edgar Allan Poe     x72836
$ grep Al interni
Louisa May Alcott   x74236
David Allan         x76438
Edgar Allan Poe     x72836
$

grep non considera allo stesso modo le lettere maiuscole e le lettere minuscole; l'output del comando rispecchia perciò il modello di ricerca impostato anche nell'uso delle maiuscole:

$ grep allan interni
$ grep Allan interni
David Allan         x76438
Edgar Allan Poe     x72836
$

Con il primo comando dell'esempio, grep non trova alcuna voce corrispondente al modello di ricerca, in quanto nessuno dei nomi presenti nel file inizia con una "a" minuscola.

Uso di grep come filtro

grep viene spesso utilizzato come "filtro" insieme ad altri comandi. Permette infatti di escludere le informazioni non richieste dall'output dei comandi. Per utilizzare grep come filtro occorre inviare a grep l'output del comando precedente utilizzando il simbolo pipe "|".

Il comando dell'esempio seguente ordina al sistema di elencare tutti i file che terminano in ".ps" creati nel mese di maggio (mag):

$ ls -l *.ps | grep mag

La prima parte della riga di comando,

ls -l *.ps

produce un elenco completo dei file:

$ ls -l *.ps
-rw-r--r--  1 elvis       7228 apr 22 15:07 bottoni.ps
-rw-r--r--  1 elvis       2356 mag 22 12:56 calendario.ps
-rw-r--r--  1 elvis       1567 giu 22 12:56 cmdtool.ps
-rw-r--r--  1 elvis      10198 giu 22 15:07 comando.ps
-rw-r--r--  1 elvis       5644 mag 22 15:07 orologio.ps
$

La seconda parte,

| grep mag

invia l'elenco ottenuto a grep, il quale ricerca il modello mag:

$ ls -l *.ps | grep mag
-rw-r--r--  1 elvis       2356 mag 22 12:56 calendario.ps
-rw-r--r--  1 elvis       5644 mag 22 15:07 orologio.ps
$

Uso di grep con stringhe di più parole

Per impostare un modello di ricerca formato da più parole separate, occorre racchiudere la stringa tra virgolette singole o doppie:

$ grep "Louisa May" interni
Louisa May Alcott     x74236
$

grep può ricercare una stringa anche in più file. Se il modello viene trovato in più file, grep stampa il nome del file seguito da due punti e dalla riga che contiene la stringa specificata:

$ grep Al *
alaska:l'Alaska è lo stato più grande degli USA.
attori:Alberto Sordi
poeti:Dante Alighieri.
$

Ricerca di righe che non contengono una data stringa

Per ricercare le righe di un file che non contengono una data stringa si utilizza l'opzione -v del comando grep. Nell'esempio seguente, vengono ricercate tutte le righe dei file della directory home dell'utente medici che non contengono la lettera e:

$ ls
alaska    attori    hinterland    insegnanti    poeti
$ grep -v e *
attori:sabato 14 marzo 1993, 10:00 MET
poeti:Guido Gozzano.
$

Altri usi di grep

Il comando grep può anche essere utilizzato con le cosiddette espressioni regolari. Le espressioni regolari sono formate da lettere o numeri abbinati a caratteri speciali che grep interpreta in modo particolare. Questi caratteri speciali, chiamati anche metacaratteri, hanno un significato particolare anche per il sistema; è perciò necessario digitarli tra virgolette o farli precedere da un carattere di escape. Per utilizzare grep con un'espressione regolare al prompt di sistema, inserire l'espressione tra virgolette o utilizzare i metacaratteri (& ! . * $ ? e \) preceduti da una barra rovesciata (\).

$ grep '^b' lista

cercherà tutte le righe del file lista che iniziano con "b."

$ grep 'b$' lista

visualizzerà tutte le righe del file lista in cui l'ultimo carattere è una "b". Il comando:

$ grep '^b$' lista

visualizzerà tutte le righe del file lista che contengono solo il carattere "b".

$ grep 'de.' lista

estrae dal file lista tutti i gruppi di tre caratteri in cui "de" siano i primi due, ad esempio "dei", "del", "scodella" e "code" (anche gli spazi vuoti sono considerati caratteri).

$ grep 'qu*' lista

produrrà l'effetto desiderato. Se tuttavia si vogliono ricercare tutte le parole che contengano la lettera "n", il comando dovrà avere la forma seguente:

$ grep 'nn*' lista

Per ricercare tutte le parole che contengano il modello "nn", il comando da inserire sarà il seguente:

$ grep 'nnn*' lista

Per comprendere meglio questa funzione di grep può essere opportuno effettuare alcune prove ed esaminare l'output dei comandi.

$ grep .* lista

Ricerca di metacaratteri

Si supponga di voler ricercare in un testo le righe che contengano il simbolo del dollaro ($). In questo caso, nell'espressione regolare il simbolo del dollaro deve essere preceduto da una barra rovesciata (\), in modo che grep ignori il significato speciale del carattere. Lo stesso vale anche per gli altri metacaratteri (& ! . * ? e \).

Ad esempio, l'espressione

$ grep ^\.

individua tutte le righe che iniziano con un punto, ed è particolarmente utile nella ricerca di richieste di formattazione nroff o troff (che iniziano con un punto).

La Tabella 4-1 contiene un elenco degli elementi più usati nei modelli di ricerca impostati con grep.

Tabella 4-1 Elementi speciali utilizzati nei modelli di ricerca con grep

Carattere 

Per ricercare 

^

L'inizio di una riga di testo 

$

La fine di una riga di testo 

.

Un carattere singolo 

[...] 

Un carattere singolo nell'elenco o nell'intervallo specificato tra parentesi 

[^...] 

Un carattere non compreso nella lista o nell'intervallo specificato 

*

Nessuna o più ricorrenze del carattere o dell'espressione regolare precedente 

.* 

Nessuna o più ricorrenze di un singolo carattere 

\

Esclude il significato speciale del carattere successivo 

Questi parametri di ricerca possono essere usati anche nell'editor di testo vi.

Uso di virgolette singole e doppie nei comandi

Come già accennato in precedenza, le virgolette vengono utilizzate per racchiudere un testo che deve essere interpretato come un'unica stringa. Ad esempio, per ricercare con grep in tutti i file della directory corrente l'espressione "luna piena", il comando da utilizzare è il seguente:

$ grep "luna piena" *

Per riunire più parole in una singola unità è anche possibile utilizzare le virgolette singole ('). Questo tipo di virgolette garantisce inoltre che determinati caratteri, ad esempio $, vengano interpretati in modo letterale. Si noti tuttavia che il metacarattere !utilizzato con history viene sempre interpretato come tale, anche racchiuso tra virgolette, a meno che non sia preceduto da una barra rovesciata. In ogni caso, per utilizzare in modo letterale caratteri speciali come & ! $ ? . ; e \, è buona norma farli precedere da un carattere di escape.

Ad esempio, digitando il comando:

$ grep $ lista

verranno visualizzate tutte le righe del file lista. Digitando invece:

$ grep '\$' lista

verranno visualizzate solo le righe che contengono il carattere "$".

Per maggiori informazioni sul comando grep(1), vedere man Pages(1): User Commands.