Exemple de utilizări ale comenzii Linux grep
Comanda Linux grep este folosită ca metodă de filtrare a intrărilor. GREP înseamnă Global Regular Expression Printer și, prin urmare, pentru a o utiliza eficient, ar trebui să aveți anumite cunoștințe despre expresiile regulate.
În acest articol, veți afla o serie de exemple care vă vor ajuta să înțelegeți comanda grep.
Cum să căutați un șir într-un fișier folosind GREP

Imaginați-vă că aveți un fișier text numit cărți cu următoarele titluri de cărți pentru copii:
- Robin Hood
- Scufita Rosie
- Peter Pan
- Goldilocks si cei trei ursi
- Alba ca Zapada si cei sapte pitici
- Pinnochio
- Pisica in palarie
- Cei trei purcelusi
- Gruffalo
- Charlie si fabrica de ciocolata
Pentru a găsi toate cărțile cu cuvântul „The” în titlu, veți folosi următoarea sintaxă:
grep Cărțile.
Următoarele rezultate vor fi returnate:
Goldilocks si cei trei ursi
Alba ca Zapada si cei sapte pitici
Pisica in palarie
Cei trei purcelusi
Gruffalo
Charlie si fabrica de ciocolata.
În fiecare caz, cuvântul „The” va fi evidențiat.
Căutarea face distincție între majuscule și minuscule, așa că dacă unul dintre titluri avea „the” în loc de „The”, atunci nu ar fi fost returnat.
Pentru a ignora cazul, puteți adăuga următorul comutator:
grep the books --ignore-case.
De asemenea, puteți utiliza comutatorul -i după cum urmează:
grep -i cărțile.
Căutați un șir într-un fișier folosind expresii regulate
Comanda grep este foarte puternică. Puteți utiliza o multitudine de tehnici de potrivire a modelelor pentru a filtra rezultatele.
În acest exemplu, vă vom arăta cum să căutați un șir într-un fișier folosind metacaracterele.
Imaginați-vă că aveți un fișier numit locuri cu următoarele nume de locuri scoțiene:
aberdeen
aberystwyth
aberlour
inverurie
inverness
Newburgh
cerb nou
noul galloway
Glasgow
Edinburgh.
Dacă doriți să găsiți toate locurile cu inver în nume, utilizați următoarea sintaxă:
grep inver* locuri.
Caracterul asterisc (*) nu funcționează la fel ca în Bash obișnuit. În contextul grep, care se ocupă de expresii regulate, asteriscul se comportă diferit. În loc să se potrivească cu oricare sau niciun caracter, cum ar fi Bash, se potrivește cu modelul introdus plus orice sau nicio repetare ulterioară a acelui model.
În exemplul de mai sus, se potrivește:
inverurie
inverness.
deoarece ambele conțin modelul „inver” așa cum a fost introdus plus zero repetări suplimentare ale acelui model. Pentru a vedea acest lucru din nou mai clar, adăugați:
repeatinverinverinver.
la listă. Nu, nu are prea mult sens, dar va demonstra cum funcționează asteriscul. Încercați să rulați comanda din nou.
grep inver* locuri.
Vezi noua linie? Asta nu ar funcționa în Bash, dar funcționează aici.
Pentru a face lucrurile și mai ciudate, rulați comanda fără asterisc.
grep inver places.
Rezultatele sunt aceleași. În mod implicit, grep va căuta un model în orice loc în care apare în șirul de text. Nici nu face diferenta de cate ori apare.
Un alt wildcard pe care îl puteți folosi este punctul (.). Puteți folosi aceasta pentru a potrivi o singură literă.
grep inver.r locuri.
Comanda de mai sus ar găsi locuri numite inverurie și inverary, dar nu ar găsi invereerie, deoarece poate exista doar un wildcard între cele două r-uri, așa cum este notat cu singura perioadă.
Caracterul metalic punct este util, dar poate cauza probleme dacă aveți unul ca parte a textului pe care îl căutați.
De exemplu, uitați-vă la această listă de nume de domenii.
- linux.lifewire.com
- pcsupport.lifewire.com
- mp3.lifewire.com
- minecraft.lifewire.com
- androidgames.lifewire.com
- netforbeginners.lifewire.com
- everydaylinuxuser.com
- google.co.uk
- google.au
- direct.gov.uk
- fakesite.lifewire1com.com
Pentru a găsi toate adresele URL lifewire.com, puteți căuta folosind următoarea sintaxă:
nume de domenii grep .com.
Comanda de mai sus ar cădea dacă lista conține următorul nume:
everydaylinuxuser.com.
Prin urmare, puteți încerca următoarea sintaxă:
grep lifewire.com nume de domenii.
Acest lucru ar funcționa bine dacă nu există un domeniu cu următorul nume:
fakesite.lifewire1com.com.
Pentru a căuta cu adevărat termenul lifewire.com, ar trebui să scăpați de punct după cum urmează:
grep lifewire\\.com nume de domenii.
Ultimul wildcard care ți se arată este semnul întrebării care reprezintă zero sau un caracter.
De exemplu:
grep -E ?ber nume de locuri.
Comanda de mai sus ar returna aberdeen, aberystwyth sau chiar berwick, dacă ar fi pe listă. Observați și steagul suplimentar „-E”. Grep nu va recunoaște? caracter fără ca acesta să permită suport extins pentru expresiile regulate.
Căutați șiruri de caractere la începutul și sfârșitul rândului folosind grep
Simbolul caratului (^) și dolarul ($) vă permit să căutați modele la începutul și la sfârșitul liniilor.
Imaginați-vă că aveți un fișier numit fotbal cu următoarele nume de echipă:
- Blackpool
- Liverpool
- orasul Manchester
- Leicester City
- Manchester United
- Newcastle United
- FC United Of Manchester
Dacă doriți să găsiți toate echipele care au început cu Manchester, ați folosi următoarea sintaxă:
grep ^Echipele Manchester.
Comanda de mai sus ar returna Manchester City și Manchester United, dar nu FC United Of Manchester.
Alternativ, puteți găsi toate echipele care se termină cu United folosind următoarea sintaxă:
echipe grep United$.
Comanda de mai sus ar reveni la Manchester United și Newcastle United, dar nu la FC United Of Manchester.
Numărarea numărului de potriviri folosind grep
Dacă nu doriți să returnați liniile reale care se potrivesc cu un model folosind grep, dar doriți doar să știți câte sunt, puteți utiliza următoarea sintaxă:
grep -c fișier de intrare model.
Dacă modelul a fost potrivit de două ori, atunci numărul 2 va fi returnat.
Găsirea tuturor termenilor care nu se potrivesc folosind grep
Imaginați-vă că aveți o listă de nume de locuri cu țările enumerate după cum urmează:
- aberdeen Scotia
- Glasgow Scotia
- Liverpool Anglia
- golful colwyn
- Londra, Anglia
Poate ați observat că golful Colwyn nu are nicio țară asociată cu el.
Pentru a căuta toate locurile cu o țară, puteți utiliza următoarea sintaxă:
grep land$ locuri.
Rezultatele returnează toate locurile, cu excepția colwyn bay.
Acest lucru, evident, funcționează doar pentru locurile care se termină în pământ (mai puțin științific).
Puteți inversa selecția folosind următoarea sintaxă:
grep -v land$ locuri.
Aceasta ar găsi toate locurile care nu se termină cu pământ.
Cum să găsiți linii goale în fișiere folosind grep
Imaginați-vă că aveți un fișier de intrare care este utilizat de o aplicație terță care nu mai citește fișierul atunci când găsește o linie goală, după cum urmează:
- aberdeen scotia
- inverness scotia
- Liverpool Anglia
- Colwyn Bay Wales
Când aplicația ajunge la linie după liverpool, se va opri din citit, ceea ce înseamnă că Colwyn Bay este ratat în totalitate.
Puteți folosi grep pentru a căuta linii goale cu următoarea sintaxă:
grep ^$ locuri.
Acest lucru nu este deosebit de util, deoarece returnează doar liniile goale.
Desigur, puteți obține o contorizare a numărului de linii goale ca verificare pentru a vedea dacă fișierul este valid după cum urmează:
grep -c ^$ locuri.
Ar fi, totuși, mai util să cunoașteți numerele de rând care au o linie goală, astfel încât să le puteți înlocui. Puteți face asta cu următoarea comandă:
grep -n ^$ locuri.
Cum să căutați șiruri de caractere majuscule sau minuscule folosind grep
Folosind grep, puteți determina ce linii dintr-un fișier au caractere majuscule folosind următoarea sintaxă:
grep numele fișierului „[A-Z]”.
Parantezele drepte [] vă permit să determinați intervalul de caractere. În exemplul de mai sus, se potrivește cu orice caracter care se află între A și Z.
Prin urmare, pentru a potrivi caracterele minuscule, puteți utiliza următoarea sintaxă:
numele fișierului grep „[a-z]”.
Dacă doriți să potriviți numai litere și nu numere sau alte simboluri, puteți utiliza următoarea sintaxă:
grep numele fișierului „[a-zA-Z]”.
Puteți face același lucru cu numerele, după cum urmează:
grep „[0-9]” nume de fișier.
Se caută modele repetate folosind grep
Puteți folosi paranteze {} pentru a căuta un model care se repetă.
Imaginați-vă că aveți un fișier cu numere de telefon după cum urmează:
- 055-1234
- 055-4567
- 555-1545
- 444-0167
- 444-0854
- 4549-2234
- x44-1234
Știți că prima parte a numărului trebuie să fie de trei cifre și doriți să găsiți liniile care nu se potrivesc cu acest model.
Din exemplul anterior, știți că [0-9] returnează toate numerele dintr-un fișier.
În acest caz, dorim liniile care încep cu trei numere urmate de o cratimă (-). Puteți face asta cu următoarea sintaxă:
grep „^[0-9][0-9][0-9]-” numere.
După cum știm din exemplele anterioare, caratul (^) înseamnă că linia trebuie să înceapă cu următorul model.
[0-9] va căuta orice număr între 0 și 9. Deoarece acesta este inclus de trei ori, se potrivește 3 numere. În cele din urmă, există o cratimă pentru a denota faptul că o cratimă trebuie să le succedă celor trei numere.
Folosind parantezele, puteți reduce căutarea după cum urmează:
grep numere „^[0-9]\{3\}-”.
Bara oblică scapă din paranteză {, astfel încât să funcționeze ca parte a expresiei regulate, dar în esență ceea ce se spune este [0-9]{3} care înseamnă orice număr între 0 și 9 de trei ori.
Parantezele pot fi folosite și după cum urmează:
{5,10}
{5,}
{5,10} înseamnă că caracterul căutat trebuie repetat de cel puțin 5 ori, dar nu mai mult de 10, în timp ce {5,} înseamnă că caracterul trebuie repetat de cel puțin 5 ori, dar poate fi mai mult de acea.
Utilizarea ieșirii de la alte comenzi Folosind grep
Până acum ne-am uitat la potrivirea modelelor în fișierele individuale, dar grep poate folosi rezultatul de la alte comenzi ca intrare pentru potrivirea modelului.
Un exemplu excelent în acest sens este utilizarea comenzii ps care listează procesele active.
De exemplu, rulați următoarea comandă:
ps -ef.
Toate procesele care rulează pe sistemul dumneavoastră vor fi afișate.
Puteți utiliza grep pentru a căuta un anumit proces de rulare, după cum urmează:
ps -ef | grep firefox.
rezumat
Comanda grep este fundamentală Linux comandă și este una care merită învățată, deoarece îți va face viața mult mai ușoară atunci când cauți fișiere și procese atunci când folosești terminalul.