Cum să utilizați comanda grep pe Linux

Publicat: 2022-01-29
Un prompt de terminal pe un computer Linux.
Fatmawati Achmad Zaenuri/Shutterstock

Comanda Linux grep este un utilitar de potrivire a șirurilor și a modelelor care afișează linii care se potrivesc din mai multe fișiere. Funcționează, de asemenea, cu ieșirea canalizată de la alte comenzi. Vă arătăm cum.

Povestea din spatele grep

Comanda grep este renumită în cercurile Linux și Unix din trei motive. În primul rând, este extrem de util. În al doilea rând, multitudinea de opțiuni poate fi copleșitoare. În al treilea rând, a fost scris peste noapte pentru a satisface o anumită nevoie. Primele două sunt bang on; al treilea este ușor dezactivat.

Ken Thompson extrasese capabilitățile de căutare a expresiilor obișnuite din editorul ed (pronunțat ee-dee) și crease un mic program - pentru uzul său - pentru a căuta prin fișiere text. Șeful său de departament de la Bell Labs, Doug Mcilroy, l-a abordat pe Thompson și a descris problema cu care se confruntă unul dintre colegii săi, Lee McMahon.

10 comenzi de bază Linux pentru începători
LEGATE 10 comenzi de bază Linux pentru începători

McMahon încerca să identifice autorii lucrărilor federaliste prin analiză textuală. Avea nevoie de un instrument care să poată căuta expresii și șiruri de caractere în fișierele text. Thompson a petrecut aproximativ o oră în acea seară făcând instrumentul său un utilitar general care ar putea fi folosit de alții și l-a redenumit grep . El a luat numele din șirul de comandă ed g/re/p , care se traduce prin „căutare globală a expresiilor regulate”.

Îl poți urmări pe Thompson vorbind cu Brian Kernighan despre nașterea grep .

Căutări simple cu grep

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

grep dave /etc/parola într-o fereastră de terminal
Publicitate

Sunt afișate liniile care se potrivesc. În acest caz, este o singură linie. Textul potrivit este evidențiat. Acest lucru se datorează faptului că în majoritatea distribuțiilor grep este alias cu:

 alias grep='grep --colour=auto'

Să ne uităm la rezultatele în care există mai multe linii care se potrivesc. Vom căuta cuvântul „Medie” într-un fișier jurnal al aplicației. Deoarece nu ne putem aminti dacă cuvântul este cu litere mici în fișierul jurnal, vom folosi opțiunea -i (ignora majuscule):

 grep -i Geek mediu-1.log 

Fiecare linie care se potrivește este afișată, cu textul potrivit evidențiat în fiecare.

Putem afișa liniile care nu se potrivesc folosind opțiunea -v (potrivire inversă).

 grep -v Mem geek-1.log 

Nu există nicio evidențiere, deoarece acestea sunt liniile care nu se potrivesc.

Publicitate

Putem determina grep să tacă complet. Rezultatul este transmis shell-ului ca valoare returnată de la grep . Un rezultat de zero înseamnă că șirul a fost găsit, iar un rezultat de unu înseamnă că nu a fost găsit. Putem verifica codul de retur folosind $? parametri speciali:

 grep -q medie geek-1.log
 eco $?
 grep -q howtogeek geek-1.log
 eco $? 

Căutări recursive cu grep

Pentru a căuta prin directoare și subdirectoare imbricate, utilizați opțiunea -r (recursivă). Rețineți că nu furnizați un nume de fișier pe linia de comandă, trebuie să furnizați o cale. Aici căutăm în directorul curent „.” și orice subdirectoare:

 grep -r -i memfree . 

Ieșirea include directorul și numele de fișier al fiecărei linii de potrivire.

Putem face grep să urmeze legături simbolice utilizând opțiunea -R (recursive dereference). Avem o legătură simbolică în acest director, numit logs-folder . Indică către /home/dave/logs .

 ls -l jurnal-folder 

Să repetăm ​​ultima noastră căutare cu opțiunea -R (recursive dereference):

 grep -R -i memfree . 

Legătura simbolică este urmată și directorul către care indică este căutat și de grep .

Căutarea cuvintelor întregi

În mod implicit, grep va potrivi o linie dacă ținta de căutare apare oriunde în acea linie, inclusiv în interiorul unui alt șir. Uită-te la acest exemplu. Vom căuta cuvântul „liber”.

 grep -i free geek-1.log 

Publicitate

Rezultatele sunt linii care au șirul „liber” în ele, dar nu sunt cuvinte separate. Ele fac parte din șirul „MemFree”.

Pentru a forța grep să se potrivească numai cu „cuvinte” separate, utilizați opțiunea -w (exp. regul cuvântului).

 grep -w -i free geek-1.log
 eco $? 

De data aceasta nu există rezultate deoarece termenul de căutare „gratuit” nu apare în fișier ca un cuvânt separat.

Utilizarea mai multor termeni de căutare

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

Această comandă caută doi termeni de căutare, „medie” și „memfree”.

 grep -E -w -i "medie|memfree" geek-1.log 

Publicitate

Toate liniile care se potrivesc sunt afișate pentru fiecare dintre termenii de căutare.

De asemenea, puteți căuta mai mulți termeni care nu sunt neapărat cuvinte întregi, dar pot fi și cuvinte întregi.

Opțiunea -e (modele) vă permite să utilizați mai mulți termeni de căutare pe linia de comandă. Folosim funcția de paranteză pentru expresii regulate pentru a crea un model de căutare. Îi spune grep să se potrivească cu oricare dintre caracterele cuprinse între paranteze „[]”. Aceasta înseamnă că grep va potrivi fie „kB” fie „KB” în timp ce caută.

Ambele șiruri sunt potrivite și, de fapt, unele linii conțin ambele șiruri.

Liniile care se potrivesc exact

-x (linia regexp) va potrivi numai liniile în care întreaga linie se potrivește cu termenul de căutare. Să căutăm o ștampilă de dată și oră despre care știm că apar o singură dată în fișierul jurnal:

 grep -x "20-Jan--06 15:24:35" geek-1.log 

Singura linie care se potrivește este găsită și afișată.

Opusul este doar arătarea liniilor care nu se potrivesc. Acest lucru poate fi util atunci când vă uitați la fișierele de configurare. Comentariile sunt grozave, dar uneori este greu de găsit setările reale printre toate. Iată /etc/sudoers :

Publicitate

Putem filtra eficient rândurile de comentarii astfel:

 sudo grep -v "#" /etc/sudoers 

Este mult mai ușor de analizat.

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

Poate exista o ocazie în care nu doriți să vedeți întreaga linie de potrivire, doar textul potrivit. Opțiunea -o (doar potrivire) face exact asta.

 grep -o MemFree geek-1.log 

Afișajul este redus la afișarea doar a textului care se potrivește cu termenul de căutare, în loc de întreaga linie de potrivire.

Numărând cu grep

grep nu este doar despre text, poate oferi și informații numerice. Putem face ca grep să conteze pentru noi în diferite moduri. Dacă vrem 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 medie geek-1.log 

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

Puteți face ca grep să afișeze numărul de linie pentru fiecare linie potrivită utilizând opțiunea -n (număr de linie).

 grep -n Jan geek-1.log 

Publicitate

Numărul de linie pentru fiecare linie potrivită este afișat la începutul liniei.

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

 grep -m5 -n Jan geek-1.log 

Adăugarea contextului

Este adesea util să poți vedea câteva linii suplimentare - eventual linii care nu se potrivesc - pentru fiecare linie care se potrivește. vă poate ajuta să distingeți care dintre liniile potrivite sunt cele care vă interesează.

Pentru a afișa unele linii după linia potrivită, utilizați opțiunea -A (după context). Solicităm trei rânduri în acest exemplu:

 grep -A 3 -x "20-ian-06 15:24:35" geek-1.log 

Pentru a vedea unele linii dinaintea liniei de potrivire, utilizați opțiunea -B (context înainte).

 grep -B 3 -x "20-ian-06 15:24:35" geek-1.log 

Și pentru a include linii de înainte și după linia de potrivire, utilizați opțiunea -C (context).

 grep -C 3 -x "20-ian-06 15:24:35" geek-1.log 

Se afișează fișierele care se potrivesc

Pentru a vedea numele fișierelor care conțin termenul de căutare, utilizaț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 , utilizați această comandă:

 grep -l "sl.h" *.c 

Numele fișierelor sunt listate, nu liniile care se potrivesc.

Publicitate

Ș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 asta.

 grep -L "sl.h" *.c 

Începutul și sfârșitul liniilor

Putem forța grep să afișeze numai potrivirile care sunt fie la începutul, fie la sfârșitul unei linii. Operatorul expresiei regulate „^” se potrivește cu începutul unei linii. Practic, toate liniile din fișierul jurnal vor conține spații, dar vom căuta linii care au un spațiu ca prim caracter:

 grep "^ " geek-1.log 

Liniile care au un spațiu ca prim caracter — la începutul liniei — sunt afișate.

Pentru a se potrivi la sfârșitul liniei, utilizați operatorul de expresie regulată „$”. Vom căuta linii care se termină cu „00”.

 grep "00$" geek-1.log 

Afișajul arată liniile care au „00” drept caractere finale.

Folosind Pipes cu grep

Desigur, puteți canaliza intrarea către grep , puteți canaliza ieșirea de la grep într-un alt program și puteți avea grep amplasat în mijlocul unui lanț de conducte.

Publicitate

Să presupunem că vrem să vedem toate aparițiile șirului „ExtractParameters” în fișierele noastre de cod sursă C. Știm că vor fi destul de multe, așa că direcționăm rezultatul în less :

 grep „ExtractParameters” *.c | Mai puțin 

Ieșirea este prezentată în less .

Acest lucru vă permite să navigați prin lista de fișiere și să utilizați facilitatea less's .

Dacă trimitem rezultatul de la grep în wc și folosim opțiunea -l (linii), putem număra numărul de linii din fișierele de cod sursă care conțin „ExtractParameters”. (Am putea realiza acest lucru utilizând opțiunea grep -c (număr), dar aceasta este o modalitate bună de a demonstra piperea din grep .)

 grep „ExtractParameters” *.c | wc -l 

Cu următoarea comandă, trimitem ieșirea de la ls în grep și transmitem ieșirea de la grep în sort . Enumerăm fișierele din directorul curent, le selectăm pe cele cu șirul „Aug” în ele și le sortăm după dimensiunea fișierului:

 ls -l | grep "Aug" | sortați +4n 

Să descompunem asta:

  • ls -l : Efectuați o listă lungă a fișierelor folosind ls .
  • grep „Aug” : Selectați liniile din lista ls care au „Aug” în ele. Rețineți că acest lucru ar găsi și fișiere care au „Aug” în numele lor.
  • sort +4n : Sortați rezultatul din grep pe a patra coloană (dimensiunea fișierului).

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

LEGATE: Cum să utilizați pipe pe Linux

grep: Mai puțin o comandă, mai mult un aliat

grep este un instrument grozav pe care îl aveți la dispoziție. Datează din 1974 și încă merge puternic pentru că avem nevoie de ceea ce face și nimic nu o face mai bine.

Cuplarea grep cu niște expresii regulate-fu chiar duce la următorul nivel.

RELATE: Cum să utilizați expresiile regulate de bază pentru a căuta mai bine și pentru a economisi timp

LEGATE: Cele mai bune laptopuri Linux pentru dezvoltatori și entuziaști