Cum să utilizați comanda grep pe Linux

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. De asemenea, funcționează cu ieșire pipetă de la alte comenzi. Vă arătăm cum.

Povestea din spatele grep

Comanda grep este renumită în Linux și Unix cercuri 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 a extras capacitățile de căutare a expresiilor regulate din editorul ed (pronunţat ee-dee) și a creat un mic program – pentru uzul său – pentru a căuta prin fișiere text. Șeful lui de departament la Laboratoarele Bell, Doug Mcilroy, a abordat Thompson și a descris problema unuia dintre colegii săi, Lee McMahon, se confrunta.

McMahon încerca să identifice autorii documentului Ziare federaliste prin analiza 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 privi pe Thompson vorbind la Brian Kernighan despre nașterea lui 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ă:

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 Average geek-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.

  Cum se creează un fișier de schimb pe Linux

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 average geek-1.log
echo $?
grep -q wdzwdz geek-1.log
echo $?

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 un link simbolic în acest director, numit jurnal-folder. Indică către /home/dave/logs.

ls -l logs-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

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
echo $?

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 depreciatul versiunea egrep a grep.)

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

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

grep -E -w -i

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

Ieșire din grep -E -w -i

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 lui 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ă.

  Cum să rulați Gmail pe desktopul Linux cu Wavebox

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

grep -x

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ă fișierul /etc/sudoers:

Putem filtra eficient rândurile de comentarii astfel:

sudo grep -v "https://www.wdzwdz.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers

sudo grep -v

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 average 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

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-Jan-06 15:24:35" geek-1.log

grep -A 3 -x

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

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

grep -B 3 -x

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

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

grep -C 3 -x

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

grep -l

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

  7 motive pentru care ar trebui să treci la Linux

Ieșire de la grep -l

Ș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

grep -L

Î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

grep

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

Ieșire grep

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

grep

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

ieșirea grep

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.

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 puține, așa că direcționăm rezultatul în mai puțin:

grep "ExtractParameters" *.c | less

grep

Ieșirea este prezentată în mai puțin.

Ieșire de la grep

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

Dacă conductăm rezultatul de la grep în wc și folosim opțiunea -l (linii), noi poate număra numărul de linii în fișierele de cod sursă care conțin „ExtractParameters”. (Am putea realiza acest lucru folosind opțiunea grep -c (numărare), dar acesta este o modalitate bună de a demonstra utilizarea conductelor din grep.)

grep "ExtractParameters" *.c | wc -l

grep

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 sortându-le după dimensiunea fișierului:

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

ls -l |  grep

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.

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.