grep

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În informatică grep (g eneral r egular și Xpression p rint) este o comanda a Unix si Unix-sisteme , și în general a POSIX [1] și GNU [2] sisteme , care caută unul sau mai multe fișiere text pentru liniile care se potrivesc cu unul sau mai multe modele specificate cu expresii regulate sau șiruri literale și produc o listă a liniilor (sau chiar doar a numelor de fișiere) care au fost potrivite. Este un tip de filtru .

grep este utilizat în mod obișnuit pentru a căuta aparițiile unuia sau mai multor cuvinte într-o serie de fișiere, adesea împreună cu comenzile find și xargs printr-o conductă software .

grep poate fi utilizat în general și cu fișiere binare , de exemplu pentru a căuta prezența anumitor etichete Exif în fișiere care conțin imagini digitale . În special, versiunea GNU a grep în acest caz listează numele fișierelor care conțin șirul indicat sau expresia regulată (și nu și porțiunea de text corespunzătoare, așa cum se întâmplă în mod normal pentru fișierele text).

Utilizare

Sintaxa generală a grep este:

 grep [opțiuni] [-e] model1 [-e model2 ...] [-] [fișier1 [fișier2 ...]]

Parametrii de fișiere opționali indică numele fișierelor care trebuie căutate. Dacă nu este specificat, căutarea se efectuează pe datele citite din intrarea standard . Prin specificarea mai multor parametri de fișier , fiecare linie pentru care a fost găsită o potrivire este precedată de numele fișierului care îl conține și de numărul liniei sale; în cazul unui singur parametru de fișier (sau niciunul), este indicat doar conținutul liniei în sine.

Parametrii șablonului specifică criteriile de căutare, iar comportamentul implicit este că sunt expresii regulate . O linie se potrivește dacă îndeplinește cel puțin unul dintre modele.

Linia dublă -- (opțional) indică faptul că următorii parametri nu trebuie considerați opțiuni.

Printre principalele opțiuni se numără:

-i
Ignorați diferențele dintre literele mari și mici.
-n
Precedeți fiecare linie de rezultate cu numărul de linie din fișier (începând cu 1).
-l
Indică doar numele fișierelor în care a fost găsit cel puțin o potrivire (fiecare fișier este listat o singură dată, indiferent de numărul de potriviri găsite în el).
-v
Neagă modelele specificate, producând o listă de linii care nu satisfac niciun model.
-E
Modelele sunt expresii regulate extinse mai degrabă decât expresii regulate de bază.
-F
Modelele sunt șiruri care trebuie căutate literalmente.
-c
Produce pentru fiecare fișier doar numărul numărului de linii care se potrivesc.

Versiunea GNU de grep (disponibilă de exemplu pe sistemele GNU / Linux ) acceptă, de asemenea, următoarele opțiuni, printre altele:

- numero
Fiecare linie pentru care a fost găsită o potrivire este listată împreună cu numărul specificat de linii adiacente acesteia (pentru a oferi context). Fiecare linie este listată o singură dată, deci chiar dacă există potriviri în rândurile adiacente, acestea nu vor fi repetate.
-A numero
Urmărește fiecare linie pentru care a fost găsită o potrivire după numărul specificat de linii care o urmează („A” înseamnă după - după).
-B numero
Precedeți fiecare linie pentru care a fost găsită o potrivire de numărul specificat de linii care o precedă („B” înseamnă înainte - înainte).

Variante

Există, de asemenea, variante istorice ale grep numite egrep și fgrep , care interpretează tiparele ca expresii regulate extinse și, respectiv, șiruri literale.

Utilizarea opțiunilor -E și -F este echivalentă cu utilizarea acestor variante.

Originea numelui grep

Numele programului provine din comanda g/re/p a ' editorului de text și care îndeplinește o funcție similară, sau căutați lobalmente g (adică în tot fișierul și nu într-o singură linie) expresie regulată (de exemplu și xpression ) și pentru a afișa ( p rint ) chibriturile.

Puncte de atenție

Ancorați textul de căutat

O expresie regulată care nu are ancore poate găsi o potrivire oriunde pe linie și, prin urmare, și în mijlocul unui cuvânt. Aceasta poate fi sursa rezultatelor neașteptate dacă ceea ce căutați era de fapt un cuvânt întreg. De exemplu, expresia regulată „10” se potrivește și cu „100”, „101”, „320103” și așa mai departe.

Soluție cu GNU grep

Versiunea GNU a grep , pe lângă ancorele de la începutul și sfârșitul liniei, are, de asemenea, suport pentru anumite metacaractere care reprezintă începutul și / sau sfârșitul oricărui cuvânt și pot fi folosite pentru a ancora restul regulilor expresie. Mai exact, secvența \< corespunde punctului de început al unui cuvânt, \> punctului în care se termină un cuvânt și \b punctului de început sau de sfârșit al unui cuvânt. De exemplu, expresia regulată \<10\> se potrivește numai cu liniile care conțin „10” ca un cuvânt separat, izolat vizual și nu „100” sau „210”.

Soluție de expresie regulată POSIX

Ancorele furnizate de standardul POSIX sunt doar cele care reprezintă începutul și sfârșitul liniei, respectiv caret ^ și simbolul dolar $ ; în acest caz, un posibil remediu este extinderea expresiei regulate prin înconjurarea ei cu [^[:alnum:]] , de exemplu cu [^[:alnum:]]10[^[:alnum:]] ; totuși, aceasta nu acoperă cazurile în care există o potrivire la începutul sau la sfârșitul liniei (în care nu există caractere precedente sau următoare) și nici nu acoperă cazurile în care expresia este întreaga linie. Pentru a lua în considerare și aceste situații, trebuie să extindeți manual cele patru cazuri, utilizând opțiuni multiple -e . De exemplu, linia de comandă grep ar deveni:

 grep -e "[^ [: alnum:]] 10 [^ [: alnum:]]" -e "[^ [: alnum:]] 10 $" -e "^ 10 [^ [: alnum:]]" -e "^ 10 $" ...

Sau puteți utiliza, de asemenea, expresii regulate extinse (opțiunea grep -E ) și wildcard | pentru a indica mai multe expresii alternative, de exemplu:

 grep -E "[^ [: alnum:]] 10 [^ [: alnum:]] | [^ [: alnum:]] 10 $ | ^ 10 [^ [: alnum:]] | ^ 10 $" .. .

Șirurile literale căutate ca expresii regulate

Comportamentul implicit al grep prevede că tiparele utilizate pentru căutare sunt expresii regulate și nu șiruri literale (pentru care trebuie specificată opțiunea -F adecvată), dar este ușor să uitați distincția, deoarece nu se întâmplă adesea că aveți pentru a căuta text care conține metacaractere precum punct . .

Problema este că distincția există de fapt și că adesea șirurile care conțin metacaractere (cum ar fi o adresă IP numerică 10.10.1.1 ) sunt, de asemenea, expresii regulate valabile, astfel încât grep nu raportează erori, dar poate oferi rezultate ale tuturor neașteptatelor. De exemplu, expresia regulată 10.1.1.1 se potrivește, de asemenea, cu 10.101.1 sau 1091a1b1 sau mai mult, iar faptul că nu este ancorată crește posibilitatea rezultatelor neașteptate.

O soluție posibilă este utilizarea opțiunii -F pentru a efectua căutări literale; cu toate acestea, acest lucru împiedică ancorarea textului (amintiți-vă că șirul literal 10.1.1.1 se potrivește și cu 10.1.1.100 sau chiar cu 210.1.1.1 ).

Dacă aceasta ar fi o problemă, este necesar să recurgeți încă o dată la expresii regulate, indicând faptul că metacaractere trebuie luate în considerare literal prin prefixarea lor una câte una cu backslash \ și apoi procedând ca în cazul în care este necesară o ancoră. De exemplu, cu versiunea GNU a grep :

 grep -e '\ <10 \ .1 \ .1 \ .1 \>' ...

Folosind bara inversă

Text shell-urile sistemelor Unix și Unix-like efectuează înlocuiri pe întreaga linie de comandă înainte de a o executa, inclusiv secvența de caractere începând cu o bară inversă \ atunci când acestea nu sunt specificate între ghilimele duble sau simple. De exemplu, linia de comandă

 grep -e 10 \ .1 \ .1 \ .1

este transformat de coajă în

 grep -e 10.1.1.1

și apoi grep va căuta cu expresia regulată 10.1.1.1 , care probabil nu a fost intenționată inițial.

Prin urmare, expresiile regulate trebuie specificate în ghilimele duble sau simple, cum ar fi în

 grep -e '10 \ .1 \ .1 \ .1 '

Folosiți cu find

Pentru a căuta mai multe fișiere într-o ierarhie de directoare , grep este adesea utilizat împreună cu comanda find , de exemplu cu:

 găsi. -tip f -name "* .c" -exec grep -e " expresie " {} +

Cu toate acestea, există posibilitatea ca grep să fie invocat prin găsirea cu un singur fișier de examinat (de exemplu, dacă găsirea a găsit un singur fișier), caz în care grep continuă să listeze liniile corespunzătoare fără a le prefixa cu numele fișierului de care aparțin (care este comportamentul implicit în cazul unui singur fișier), oferind astfel un rezultat diferit de ceea ce se așteaptă în mod normal.

Pentru a-l remedia, numele unui prim fișier poate fi specificat direct între parametrii grep , astfel încât grep este întotdeauna invocat cu cel puțin două nume de fișiere care trebuie examinate. În acest scop /dev/null este la îndemână, este întotdeauna prezent și nu conține niciodată date și, prin urmare, este ideal ca fișier „de umplere” care nu afectează căutările. De exemplu:

 găsi. -tip f -nume "* .c" -exec grep -e " expresie " / dev / null {} +

Notă

  1. ^ (EN) grep , din Specificațiile de bază ale grupului deschis numărul 6 IEEE Std 1003.1-2008. Adus la 26 iunie 2009 .
  2. ^ (EN) grep, imprimați liniile în potrivirea modelelor , pe manualul GNP grep. Adus la 19 mai 2008 .

Alte proiecte

linkuri externe

Controlul autorității GND ( DE ) 7692411-7
Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT