Cum să utilizați comanda grep pe Linux

Utilitarul Linux grep este un instrument puternic pentru căutarea de șiruri și modele, care afișează liniile corespunzătoare din diverse fișiere. De asemenea, poate fi folosit cu ieșirea din alte comenzi prin intermediul pipe-urilor. În continuare, vom explora modul său de utilizare.

Originea comenzii grep

Comanda grep este faimoasă în universul Linux și Unix datorită a trei aspecte principale. În primul rând, este incredibil de folositoare. În al doilea rând, multitudinea sa de opțiuni poate fi copleșitoare. În al treilea rând, se spune că a fost creată peste noapte pentru a rezolva o nevoie specifică. Primele două afirmații sunt perfect adevărate, dar a treia este o ușoară exagerare.

Ken Thompson a extras capacitățile de căutare folosind expresii regulate din editorul ed (pronunțat „ee-dee”) și a dezvoltat un mic program, inițial pentru uz personal, cu scopul de a căuta în fișiere text. Ulterior, șeful său de departament de la Laboratoarele Bell, Doug McIlroy, l-a contactat pe Thompson pentru a-i prezenta problema cu care se confrunta unul dintre colegii lor, Lee McMahon.

McMahon încerca să determine autorii documentului „The Federalist Papers” printr-o analiză textuală. Avea nevoie de un instrument care să poată căuta expresii și șiruri în fișiere text. Thompson a dedicat aproximativ o oră în acea seară pentru a transforma instrumentul său într-un utilitar general care să poată fi folosit și de alții, redenumindu-l grep. Numele a fost derivat din șirul de comandă ed, adică g/re/p, care se traduce prin „căutare globală a expresiilor regulate”.

Îl puteți vedea pe Thompson discutând despre nașterea lui grep într-o conversație cu Brian Kernighan.

Căutări simple cu grep

Pentru a căuta un șir într-un fișier, introduceți termenul de căutare și numele fișierului în linia de comandă:

    grep "termen_de_căutare" nume_fișier

Liniile care conțin șirul căutat vor fi afișate, iar textul corespunzător va fi evidențiat. Acest lucru se întâmplă deoarece, în majoritatea distribuțiilor, grep este configurat cu un alias:

    alias grep='grep --color=auto'

Să analizăm situația în care avem mai multe linii care se potrivesc. Vom căuta cuvântul „Medie” într-un fișier jurnal al unei aplicații. Pentru că nu suntem siguri dacă cuvântul este scris cu litere mici în fișierul jurnal, vom folosi opțiunea -i (ignoră majusculele):

    grep -i Medie fisier.log

Fiecare linie corespunzătoare este afișată, cu textul relevant evidențiat în fiecare.

Pentru a afișa liniile care nu se potrivesc, folosim opțiunea -v (potrivire inversă):

    grep -v Mem fisier.log

În acest caz, nu există evidențiere, deoarece afișăm liniile care nu conțin textul căutat.

Putem face ca grep să nu afișeze nimic. Rezultatul este transmis shell-ului ca valoare returnată de grep. O valoare zero indică faptul că șirul a fost găsit, iar o valoare unu indică faptul că nu a fost găsit. Putem verifica codul de retur folosind variabila specială $?:

    grep -q average fisier.log
    echo $?
    grep -q cuvant_inexistent fisier.log
    echo $?

Căutări recursive cu grep

Pentru a căuta în directoare și subdirectoare, se utilizează opțiunea -r (recursiv). Este important de reținut că nu introducem numele unui fișier în linia de comandă, ci o cale. În acest exemplu, căutăm în directorul curent „.” și în orice subdirectoare:

    grep -r -i termen_de_căutare .

Rezultatul include directorul și numele fișierului pentru fiecare linie care se potrivește.

Putem folosi opțiunea -R (recursiv dereferențiat) pentru ca grep să urmărească legăturile simbolice. În directorul nostru, avem o legătură simbolică numită folder_jurnal, care indică către /home/utilizator/jurnale.

        ls -l folder_jurnal
    

Să repetăm ultima căutare, dar cu opțiunea -R:

    grep -R -i termen_de_căutare .

În acest caz, legătura simbolică este urmată, iar directorul către care indică este, de asemenea, inclus în căutare de către grep.

Căutarea cuvintelor întregi

Implicit, grep va găsi o linie dacă șirul de căutare apare oriunde în acea linie, chiar și în interiorul altor cuvinte. Analizați acest exemplu. Vom căuta cuvântul „gratuit”.

    grep -i gratuit fisier.log

Rezultatele includ liniile care conțin șirul „gratuit”, dar nu ca un cuvânt independent, ci ca parte a șirului „MemGratuit”.

Pentru a impune ca grep să caute doar cuvinte complete, folosim opțiunea -w (expresie regulată de cuvânt):

    grep -w -i gratuit fisier.log
    echo $?

În acest caz, nu avem niciun rezultat, deoarece termenul „gratuit” nu apare în fișier ca un cuvânt separat.

Utilizarea mai multor termeni de căutare

Opțiunea -E (expresie regulată extinsă) vă permite să căutați mai multe cuvinte (opțiunea -E înlocuiește versiunea egrep depreciată a grep).

Această comandă caută doi termeni: „medie” și „memorie_libera”.

    grep -E -w -i "medie|memorie_libera" fisier.log

Sunt afișate toate liniile corespunzătoare fiecărui termen de căutare.

Puteți căuta, de asemenea, mai mulți termeni care nu sunt neapărat cuvinte complete, dar pot fi și cuvinte complete.

Opțiunea -e (modele) vă permite să specificați mai mulți termeni de căutare în linia de comandă. Folosim funcția de paranteză a expresiilor regulate pentru a crea un model de căutare. Aceasta indică lui grep să găsească oricare dintre caracterele incluse între paranteze []. În acest caz, grep va căuta fie „kB”, fie „KB”.

Ambele șiruri sunt găsite și, de fapt, unele linii conțin ambele șiruri.

Liniile care se potrivesc exact

Opțiunea -x (linie regex) va căuta doar liniile în care întreaga linie se potrivește cu termenul de căutare. Să căutăm un marcaj temporal unic, despre care știm că apare o singură dată în fișierul jurnal:

    grep -x "20-Ian--06 15:24:35" fisier.log

Singura linie care corespunde este găsită și afișată.

Opusul este afișarea liniilor care nu se potrivesc. Acest lucru poate fi util la examinarea fișierelor de configurare. Comentariile sunt utile, dar uneori este dificil să găsim setările reale printre ele. Iată fișierul /etc/sudoers:

Putem elimina eficient rândurile de comentarii astfel:

    sudo grep -v "https://www.exemplu.com/articol" /etc/sudoers

Este mult mai ușor de analizat.

Se afișează doar textul care se potrivește

Pot exista situații în care doriți să vedeți doar textul care se potrivește, nu întreaga linie. Opțiunea -o (doar potrivirea) face exact acest lucru.

    grep -o text_de_căutat fisier.log

Afișajul este redus la afișarea doar a textului care corespunde termenului de căutare, în loc de întreaga linie.

Numărând cu grep

grep nu se limitează doar la text, ci poate oferi și informații numerice. Putem face ca grep să numere pentru noi în diferite moduri. Dacă dorim să știm de câte ori apare un termen de căutare într-un fișier, putem folosi opțiunea -c (numărare):

    grep -c termen_de_căutare fisier.log

grep raportează că termenul de căutare apare de 240 de ori în acest fișier.

Puteți solicita lui grep să afișeze numărul liniei pentru fiecare linie corespunzătoare, folosind opțiunea -n (număr de linie):

    grep -n termen_de_căutare fisier.log

Numărul liniei pentru fiecare linie corespunzătoare este afișat la începutul liniei.

Pentru a limita numărul de rezultate afișate, utilizați opțiunea -m (număr maxim). Vom limita rezultatul la cinci linii potrivite:

    grep -m5 -n termen_de_căutare fisier.log

Adăugarea contextului

Adesea, este util să puteți vizualiza câteva linii suplimentare (eventual linii care nu se potrivesc) pentru fiecare linie care se potrivește. Acest lucru vă poate ajuta să determinați care dintre liniile potrivite sunt cele de interes.

Pentru a afișa unele linii după linia corespunzătoare, folosiți opțiunea -A (context după). În acest exemplu, vom solicita trei rânduri:

    grep -A 3 -x "20-Ian-06 15:24:35" fisier.log

Pentru a vizualiza linii dinaintea liniei de potrivire, folosiți opțiunea -B (context înainte):

    grep -B 3 -x "20-Ian-06 15:24:35" fisier.log

Și pentru a include linii atât dinaintea, cât și după linia de potrivire, folosiți opțiunea -C (context):

    grep -C 3 -x "20-Ian-06 15:24:35" fisier.log

Afișarea fișierelor care se potrivesc

Pentru a vizualiza numele fișierelor care conțin termenul de căutare, folosiți opțiunea -l (fișiere cu potrivire). Pentru a afla ce fișiere de cod sursă C conțin referințe la fișierul antet sl.h, puteți folosi această comandă:

    grep -l "sl.h" *.c

Sunt listate doar numele fișierelor, nu liniile care se potrivesc.

Și, desigur, putem căuta fișiere care nu conțin termenul de căutare. Opțiunea -L (fișiere fără potrivire) face exact acest lucru.

    grep -L "sl.h" *.c

Începutul și sfârșitul liniilor

Putem impune lui grep să afișeze doar potrivirile care se află fie la începutul, fie la sfârșitul unei linii. Operatorul expresiei regulate ^ corespunde începutului unei linii. Deși majoritatea liniilor din fișierul jurnal conțin spații, vom căuta liniile care au un spațiu ca prim caracter:

    grep "^ " fisier.log

Sunt afișate liniile care au un spațiu ca prim caracter, adică la începutul liniei.

Pentru a găsi potriviri la sfârșitul liniei, folosiți operatorul expresiei regulate $. Vom căuta liniile care se termină cu 00.

    grep "00$" fisier.log

Afișajul prezintă liniile care se termină cu 00.

Folosind Pipes cu grep

Desigur, puteți introduce date în grep, redirecționa ieșirea de la grep către un alt program și puteți include grep într-un lanț de pipe-uri.

Să presupunem că dorim să vedem toate aparițiile șirului „ExtrageParametri” în fișierele noastre de cod sursă C. Știm că vor fi destul de multe, așa că vom redirecționa rezultatul către less:

    grep "ExtrageParametri" *.c | less

Rezultatul este afișat în less.

Acest lucru vă permite să navigați prin lista de fișiere și să utilizați funcția de căutare a lui less.

Dacă redirecționăm rezultatul de la grep către wc și folosim opțiunea -l (linii), putem contoriza numărul de linii din fișierele de cod sursă care conțin „ExtrageParametri” (am putea face acest lucru folosind opțiunea grep -c (numărare), dar aceasta este o modalitate bună de a demonstra utilizarea pipe-urilor cu grep).

    grep "ExtrageParametri" *.c | wc -l

Cu următoarea comandă, redirecționăm ieșirea de la ls către grep și ieșirea de la grep către sort. Listăm fișierele din directorul curent, le selectăm pe cele cu șirul „Aug” și le sortăm în funcție de dimensiunea fișierului:

    ls -l | grep "Aug" | sort +4n

Să analizăm această comandă:

  • ls -l: Efectuează o listă lungă a fișierelor folosind ls.
  • grep "Aug": Selectează liniile din lista ls care conțin „Aug”. Trebuie remarcat că, în acest mod, ar fi găsite și fișierele care au „Aug” în nume.
  • sort +4n: Sortează rezultatul obținut de grep după a patra coloană (dimensiunea fișierului).

Astfel, obținem o listă sortată a tuturor fișierelor modificate în luna august (indiferent de an), în ordine crescătoare a dimensiunii fișierului.

grep: Mai mult decât o comandă, un aliat

grep este un instrument excelent pe care îl aveți la dispoziție. A apărut în 1974 și este încă folosit astăzi, deoarece este esențial pentru ceea ce face și nimic altceva nu o face mai bine.

Combinarea lui grep cu expresii regulate duce funcționalitatea sa la un alt nivel.