In questo capitolo viene descritto come ricercare all'interno di file o directory determinate stringhe o parole chiave utilizzando il comando grep di SunOS.
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.
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.
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:
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 $ |
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. $ |
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. $ |
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".
All'interno di un'espressione regolare, un punto (.) sostituisce qualsiasi carattere singolo. Ad esempio, il comando:
$ 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).
Se un carattere è seguito da un asterisco (*), grep lo interpreta come "nessuna o più ricorrenze di quel carattere". Se l'asterisco è posto dopo un'espressione regolare, grep lo interpreta come "nessuna o più ricorrenze dei caratteri corrispondenti al modello di ricerca".
Il fatto che grep possa individuare anche i casi di "nessuna ricorrenza" di un carattere o di un modello di ricerca rende l'uso dell'asterisco poco intuitivo. Volendo ad esempio ricercare tutte le parole che contengano le lettere "qu", il comando:
$ 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.
Per ricercare nessuna o più ricorrenze di un qualsiasi carattere del file lista, digitare:
$ grep .* lista |
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.
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.