Ininformaticagrep (globalregularexpressionprint) è uncomando dei sistemiUnix eUnix-like, e più in generale dei sistemiPOSIX[1] eGNU[2], che ricerca in uno o piùfile di testo le linee che corrispondono ad uno o più modelli specificati conespressioni regolari ostringhe letterali, e produce un elenco delle linee (o anche dei soli nomi di file) per cui è stata trovata corrispondenza. È un tipo difiltro.
grep è comunemente utilizzato per ricercare le occorrenze di una o più parole in una serie di file, spesso in congiunzione con i comandifind exargs tramite unapipeline software.
grep può generalmente essere impiegato anche confile binari, ad esempio per ricercare la presenza di particolari etichetteExif all'interno di file contenentiimmagini digitali. In particolare, la versione GNU digrep in questo caso elenca i nomi dei file contenenti la stringa o espressione regolare indicata (e non anche la porzione di testo corrispondente, come normalmente accade per i file di testo).
Lasintassi generale digrep è:
grep [opzioni] [-e]modello1 [-emodello2 …] [--] [file1 [file2 …] ]
I parametri facoltativifile indicano i nomi dei file su cui effettuare la ricerca. Se non specificati, la ricerca viene effettuata sui dati letti dallostandard input. Specificando più di un parametrofile, ogni linea per cui è stata trovata una corrispondenza viene preceduta dal nome del file che la contiene e dal suo numero di linea; in caso di un solo parametrofile (o nessuno) viene invece indicato solo il contenuto della linea stessa.
I parametrimodello specificano il criterio di ricerca, ed il comportamento predefinito prevede che si tratti diespressioni regolari. Una linea trova corrispondenza se soddisfa almeno uno dei modelli.
Il doppio trattino-- (facoltativo) indica che i parametri successivi non sono da considerarsi opzioni.
Tra le opzioni principali vi sono:
-i-n-l-v-E-F-cLa versioneGNU digrep (disponibile ad esempio sui sistemiGNU/Linux) supporta tra le altre anche le seguenti opzioni:
-numero-Anumero-BnumeroStoricamente esistono anche varianti digrep chiamateegrep efgrep, le quali interpretano imodelli rispettivamente come espressioni regolari estese e come stringhe letterali.
L'uso delle opzioni-E e-F equivale all'uso di queste varianti.
Il nome del programma deriva dal comandog/re/p dell'editor di testoed che svolge una funzione simile, ovvero ricercareglobalmente (ovvero in tutto il file e non in una sola linea) un'espressione regolare (regularexpression) e di mostrare (print) le corrispondenze.
Un'espressione regolare che sia priva di ancoraggi può trovare corrispondenza in un punto qualsiasi della linea, e quindi anche nel mezzo di una parola.Questo può essere fonte di risultati inattesi se quello che si intendeva ricercare era in realtà un'intera parola.Ad esempio l'espressione regolare "10" trova corrispondenza anche in "100", "101", "320103" e così via.
La versioneGNU digrep, oltre che per gli ancoraggi a inizio e fine linea, ha supporto anche per particolarimetacaratteri che rappresentano l'inizio e/o la fine di una qualsiasi parola, e possono essere usati perancorare il resto dell'espressione regolare. Nello specifico la sequenza\< corrisponde al punto d'inizio di una parola,\> al punto in cui termina una parola, e\b al punto d'inizio o di termine di una parola.Ad esempio, l'espressione regolare\<10\> trova corrispondenza solo in linee che contengono "10" come parola a sé stante, in maniera visivamente isolata, e non "100" o "210".
Gli ancoraggi previsti dallo standardPOSIX sono solo quelli che rappresentano l'inizio e la fine della linea, rispettivamente l'accento circonflesso^ ed il simbolo del dollaro$; in questo caso un possibile rimedio consiste nell'estendere l'espressione regolare circondandola con[^[:alnum:]], ad esempio con[^[:alnum:]]10[^[:alnum:]];ciò tuttavia non copre i casi in cui vi sia corrispondenza all'inizio o alla fine della linea (in cui non vi sono caratteri precedenti o caratteri successivi) e nemmeno il caso in cui l'espressione sia l'intera linea.Per considerare anche queste situazioni occorre espandere manualmente i quattro casi, ricorrendo a più opzioni-e.Ad esempio lariga di comando digrep diventerebbe:
grep -e "[^[:alnum:]]10[^[:alnum:]]" -e "[^[:alnum:]]10$" -e "^10[^[:alnum:]]" -e "^10$" …Oppure si può anche ricorrere alle espressioni regolari estese (opzione digrep-E) e almetacarattere| per indicare più espressioni alternative, ad esempio:
grep -E "[^[:alnum:]]10[^[:alnum:]]|[^[:alnum:]]10$|^10[^[:alnum:]]|^10$" …Il comportamento predefinito digrep prevede che i modelli usati per la ricerca siano delleespressioni regolari e non stringhe letterali (per le quali occorre specificare l'apposita opzione-F), ma è facile scordarsi della distinzione poiché non capita spesso di dover ricercare testo contenente deimetacaratteri come il punto..
Il problema è che la distinzione in realtà sussiste, e che spesso le stringhe contenenti dei metacaratteri (come ad esempio unindirizzo IP numerico10.10.1.1) sono anche delle valide espressioni regolari, per cuigrep non segnala alcun errore, ma può fornire risultati del tutto inattesi.Ad esempio l'espressione regolare10.1.1.1 trova corrispondenza anche in10.101.1 o in1091a1b1 o altro ancora, e unitamente al fatto che non sia ancorata aumenta la possibilità di risultati inattesi.
Una possibile soluzione consiste appunto nell'usare l'opzione-F in modo da effettuare ricerche letterali; ciò tuttavia impedisce di ancorare il testo (si ricorda che la stringa letterale10.1.1.1 trova corrispondenza anche in10.1.1.100 o anche210.1.1.1).
Se ciò fosse un problema, occorre ricorrere ancora una volta alle espressioni regolari, indicando che i metacaratteri vanno considerati in maniera letterale prefissandoli uno ad uno con la barra inversa\ e poi procedendo come per il caso in cui si necessita di ancoraggio. Ad esempio, con la versione GNU digrep:
grep -e '\<10\.1\.1\.1\>' …Leshell testuali dei sistemiUnix eUnix-like effettuano sostituzioni sull'intera riga di comando prima di eseguirla, tra le quali vi è anche quella delle sequenze di caratteri che iniziano con unabarra inversa\ quando non sono specificate travirgolette doppie o apici singoli. Ad esempio, la riga di comando
grep -e 10\.1\.1\.1
viene trasformata dalla shell in
grep -e 10.1.1.1
e quindigrep si ritroverebbe ad operare ricerche con l'espressione regolare10.1.1.1, che probabilmente non era nelle intenzioni originali.
È quindi opportuno specificare le espressioni regolari tra virgolette doppie o apici singoli, come ad esempio in
grep -e '10\.1\.1\.1'
Per effettuare ricerche in piùfile all'interno di una gerarchia didirectory si usa spessogrep in combinazione con il comandofind, ad esempio con:
find . -type f -name "*.c" -exec grep -e "espressione" {} +Così facendo esiste tuttavia la possibilità chegrep sia invocato dafind con un unico file da esaminare (ad esempio sefind trovasse un solo file), nel qual casogrep procede a elencare le linee corrispondenti senza prefissarle con il nome file a cui esse appartengono (che è il comportamento predefinito nel caso di un unico file), quindi offrendo un risultato diverso da quello normalmente atteso.
Per rimediare si può esplicitare direttamente tra i parametri digrep il nome di un primo file, in modo chegrep sia invocato sempre con almeno due nomi di file da esaminare. Allo scopo torna comodo/dev/null, che è sempre presente e non contiene mai dati, ed è quindi l'ideale come file "riempitivo" che non influenza le ricerche. Ad esempio:
find . -type f -name "*.c" -exec grep -e "espressione" /dev/null {} +Altri progetti
| Controllo di autorità | GND(DE) 7692411-7 |
|---|