GrepIn informatica grep (general regular expression print) è un comando dei sistemi Unix e Unix-like, e più in generale dei sistemi POSIX[1] e GNU[2], che ricerca in uno o più file di testo le linee che corrispondono ad uno o più modelli specificati con espressioni regolari o stringhe letterali, e produce un elenco delle linee (o anche dei soli nomi di file) per cui è stata trovata corrispondenza. È un tipo di filtro. grep è comunemente utilizzato per ricercare le occorrenze di una o più parole in una serie di file, spesso in congiunzione con i comandi find e xargs tramite una pipeline software. grep può generalmente essere impiegato anche con file binari, ad esempio per ricercare la presenza di particolari etichette Exif all'interno di file contenenti immagini digitali. In particolare, la versione GNU di grep 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). UsoLa sintassi generale di grep è: grep [opzioni] [-e] modello1 [-e modello2 …] [--] [file1 [file2 …] ] I parametri facoltativi file indicano i nomi dei file su cui effettuare la ricerca. Se non specificati, la ricerca viene effettuata sui dati letti dallo standard input. Specificando più di un parametro file, 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 parametro file (o nessuno) viene invece indicato solo il contenuto della linea stessa. I parametri modello specificano il criterio di ricerca, ed il comportamento predefinito prevede che si tratti di espressioni regolari. Una linea trova corrispondenza se soddisfa almeno uno dei modelli. Il doppio trattino Tra le opzioni principali vi sono:
La versione GNU di grep (disponibile ad esempio sui sistemi GNU/Linux) supporta tra le altre anche le seguenti opzioni:
VariantiStoricamente esistono anche varianti di grep chiamate egrep e fgrep, le quali interpretano i modelli rispettivamente come espressioni regolari estese e come stringhe letterali. L'uso delle opzioni Origine del nome grepIl nome del programma deriva dal comando Punti di attenzioneAncoraggio del testo da ricercareUn'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. Soluzione con GNU grepLa versione GNU di grep, oltre che per gli ancoraggi a inizio e fine linea, ha supporto anche per particolari metacaratteri che rappresentano l'inizio e/o la fine di una qualsiasi parola, e possono essere usati per ancorare il resto dell'espressione regolare. Nello specifico la sequenza Soluzione con espressioni regolari POSIXGli ancoraggi previsti dallo standard POSIX sono solo quelli che rappresentano l'inizio e la fine della linea, rispettivamente l'accento circonflesso grep -e "[^[:alnum:]]10[^[:alnum:]]" -e "[^[:alnum:]]10$" -e "^10[^[:alnum:]]" -e "^10$" … Oppure si può anche ricorrere alle espressioni regolari estese (opzione di grep grep -E "[^[:alnum:]]10[^[:alnum:]]|[^[:alnum:]]10$|^10[^[:alnum:]]|^10$" … Stringhe letterali cercate come espressioni regolariIl comportamento predefinito di grep prevede che i modelli usati per la ricerca siano delle espressioni regolari e non stringhe letterali (per le quali occorre specificare l'apposita opzione Il problema è che la distinzione in realtà sussiste, e che spesso le stringhe contenenti dei metacaratteri (come ad esempio un indirizzo IP numerico Una possibile soluzione consiste appunto nell'usare l'opzione 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 grep -e '\<10\.1\.1\.1\>' … Utilizzo della barra inversaLe shell testuali dei sistemi Unix e Unix-like effettuano sostituzioni sull'intera riga di comando prima di eseguirla, tra le quali vi è anche quella delle sequenze di caratteri che iniziano con una barra inversa grep -e 10\.1\.1\.1 viene trasformata dalla shell in grep -e 10.1.1.1 e quindi grep si ritroverebbe ad operare ricerche con l'espressione regolare È quindi opportuno specificare le espressioni regolari tra virgolette doppie o apici singoli, come ad esempio in grep -e '10\.1\.1\.1' Utilizzo con findPer effettuare ricerche in più file all'interno di una gerarchia di directory si usa spesso grep in combinazione con il comando find, ad esempio con: find . -type f -name "*.c" -exec grep -e "espressione" {} + Così facendo esiste tuttavia la possibilità che grep sia invocato da find con un unico file da esaminare (ad esempio se find trovasse un solo file), nel qual caso grep 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 di grep il nome di un primo file, in modo che grep sia invocato sempre con almeno due nomi di file da esaminare. Allo scopo torna comodo find . -type f -name "*.c" -exec grep -e "espressione" /dev/null {} + Note
Altri progetti
Collegamenti esterni
|