Movatterモバイル変換


[0]ホーム

URL:


Vai al contenuto
WikipediaL'enciclopedia libera
Ricerca

grep

Da Wikipedia, l'enciclopedia libera.

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).

Uso

[modifica |modifica wikitesto]

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
Ignora le differenze tra lettere maiuscole e minuscole.
-n
Precede ogni linea dei risultati con il numero di linea all'interno del file (partendo da 1).
-l
Indica solo i nomi dei file in cui è stata trovata almeno una corrispondenza (ciascun file è elencato una sola volta, indipendentemente dal numero di corrispondenze in esso trovate).
-v
Nega i modelli specificati, producendo un elenco delle linee che non soddisfano alcun modello.
-E
I modelli sonoespressioni regolari estese invece che espressioni regolari di base.
-F
I modelli sonostringhe che vanno ricercate in maniera letterale.
-c
Produce per ciascun file solo il conteggio del numero di linee che corrispondono.

La versioneGNU digrep (disponibile ad esempio sui sistemiGNU/Linux) supporta tra le altre anche le seguenti opzioni:

-numero
Ogni linea per cui è stata trovata una corrispondenza viene elencata insieme alnumero specificato di linee ad essa adiacenti (per fornire il contesto). Ogni linea è elencata una sola volta, per cui anche se vi fossero corrispondenze nelle linee adiacenti, esse non saranno ripetute.
-Anumero
Fa seguire ogni linea per cui è stata trovata una corrispondenza dalnumero specificato di linee che la seguono (la "A" sta perafter - dopo).
-Bnumero
Fa precedere ogni linea per cui è stata trovata una corrispondenza dalnumero specificato di linee che la precedono (la "B" sta perbefore - prima).

Varianti

[modifica |modifica wikitesto]

Storicamente 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.

Origine del nomegrep

[modifica |modifica wikitesto]

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.

Punti di attenzione

[modifica |modifica wikitesto]

Ancoraggio del testo da ricercare

[modifica |modifica wikitesto]

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.

Soluzione con GNUgrep

[modifica |modifica wikitesto]

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".

Soluzione con espressioni regolari POSIX

[modifica |modifica wikitesto]

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$" …

Stringhe letterali cercate come espressioni regolari

[modifica |modifica wikitesto]

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\>' …

Utilizzo della barra inversa

[modifica |modifica wikitesto]

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'

Utilizzo con find

[modifica |modifica wikitesto]

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 {} +

Note

[modifica |modifica wikitesto]
  1. (EN)grep, suThe Open Group Base Specifications Issue 6 IEEE Std 1003.1-2008.URL consultato il 26 giugno 2009.
  2. (EN)grep, print lines matching a pattern, suGNU grep manual.URL consultato il 19 maggio 2008.

Altri progetti

[modifica |modifica wikitesto]

Altri progetti

Collegamenti esterni

[modifica |modifica wikitesto]
V · D · M
ProgrammiUnix/Unix-like coninterfaccia a riga di comando e comandi interni dellashell unix
File systemcat ·cd ·chattr ·chmod ·chown ·chgrp ·cksum ·cmp ·cp ·du ·df ·fdisk ·file ·fsck ·fuser ·gzip ·ln ·ls ·lsattr ·lsof ·mkdir ·mknod ·mount ·mv ·pwd ·rm ·rmdir ·split ·tar ·touch ·umount ·umask
Processiat ·chroot ·crontab ·exit ·kill ·killall ·nice ·nohup ·pgrep ·pidof ·pkill ·ps ·pstree ·sleep ·time ·top ·wait
Ambiente utentealias ·env ·export ·finger ·id ·logname ·mesg ·newgrp ·passwd ·su ·sudo ·uname ·uptime ·w ·wall ·who ·whoami ·write
Elaborazione testoawk ·comm ·cut ·diff ·ed ·ex ·fmt ·head ·iconv ·join ·less ·more ·paste ·sed ·sort ·tail ·tr ·uniq ·vi ·wc ·xargs
Script di shellbasename ·dirname ·echo ·expr ·false ·printf ·test ·true ·unset
Retedig ·nslookup ·ifconfig ·netstat ·ping ·rcp ·rlogin ·route ·netcat ·traceroute
Ricerchefind ·grep ·strings
Amministrazionedmesg ·groupadd ·groupdel ·groupmod ·mdadm ·shutdown ·useradd ·userdel ·usermod
Altribanner ·bc ·cal ·clear ·date ·dd ·lp ·man ·size ·tee ·tput ·yes
Controllo di autoritàGND(DE) 7692411-7
 Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica
Estratto da "https://it.wikipedia.org/w/index.php?title=Grep&oldid=143622869"
Categorie:
Categorie nascoste:

[8]ページ先頭

©2009-2026 Movatter.jp