Primjer upotrebe naredbe grep u Linuxu

Linux naredba grep koristi se kao metoda za filtriranje unosa. GREP je skraćenica od Global Regular Expression Printer i stoga da biste ga učinkovito koristili, trebali biste imati određeno znanje o regularnim izrazima.

U ovom ćete članku naučiti niz primjera koji će vam pomoći razumjeti naredbu grep.

Kako tražiti niz u datoteci pomoću GREP-a

Ručna snimka zaslona za naredbu grep za Linux

Zamislite da imate tekstualnu datoteku pod nazivom knjige sa sljedećim naslovima dječjih knjiga:

  • Robin Hood
  • Crvenkapica
  • Petar Pan
  • Zlatokosa i tri medvjeda
  • Snjeguljica i sedam patuljaka
  • Pinnochio
  • Mačak u šeširu
  • Tri mala praščića
  • Gruffalo
  • Charlie i tvornica čokolade

Da biste pronašli sve knjige s riječju "The" u naslovu, upotrijebili biste sljedeću sintaksu:

grep Knjige. 

Bit će vraćeni sljedeći rezultati:

Zlatokosa i tri medvjeda
Snjeguljica i sedam patuljaka
Mačak u šeširu
Tri mala praščića
Gruffalo
Charlie i tvornica čokolade.

U svakom slučaju, riječ "The" bit će istaknuta.

Pretraživanje je osjetljivo na velika i mala slova pa da je jedan od naslova imao "the" umjesto "The" onda ne bi bio vraćen.

Da biste zanemarili velika i mala slova, možete dodati sljedeći prekidač:

grep the books --ignore-case. 

Također možete koristiti prekidač -i na sljedeći način:

grep -i knjige. 

Potražite niz u datoteci pomoću regularnih izraza

Naredba grep je vrlo moćna. Za filtriranje rezultata možete koristiti mnoštvo tehnika podudaranja uzoraka.

U ovom primjeru ćemo vam pokazati kako tražiti niz u datoteci pomoću zamjenskih znakova.

Zamislite da imate datoteku pod nazivom mjesta sa sljedećim škotskim nazivima mjesta:

aberdeen
aberystwyth
aberlour
inverurie
inverness
Newburgh
novi jeleni
novi galoway
Glasgow
edinburgh.

Ako želite pronaći sva mjesta s inver u imenu, koristite sljedeću sintaksu:

grep inver* mjesta. 

Znak zvjezdice (*) ne radi baš kao u običnom Bashu. U kontekstu grep, koji se bavi regularnim izrazima, zvjezdica se ponaša drugačije. Umjesto da se podudara s bilo kojim ili bez znakova, kao što je Bash, on odgovara unesenom uzorku plus bilo koje naknadno ponavljanje tog uzorka ili ga nema.

U gornjem primjeru odgovara:

inverurie
inverness.

jer oba sadrže uzorak "inver" kao što je uneseno plus nula dodatnih ponavljanja tog uzorka. Da biste to ponovno vidjeli jasnije, dodajte:

repeatinverinverinver. 

na popis. Ne, nema puno smisla, ali će pokazati kako zvjezdica radi. Pokušajte ponovno pokrenuti naredbu.

grep inver* mjesta.

Vidite li novu liniju? To ne bi uspjelo u Bashu, ali ovdje radi.

Da stvari budu još čudnije, pokrenite naredbu bez zvjezdice.

grep inver mjesta. 

Rezultati su isti. Prema zadanim postavkama, grep će tražiti uzorak na bilo kojem mjestu na kojem se pojavljuje u nizu teksta. Ne razlikuje se ni koliko se puta pojavljuje.

Još jedan zamjenski znak koji možete koristiti je točka (.). Ovo možete koristiti za podudaranje jednog slova.

grep inver.r mjesta. 

Gornja naredba pronašla bi mjesta koja se zovu inverurie i inverary, ali ne bi pronašla invereerie jer između dva r-a može postojati samo jedan zamjenski znak kako je označeno jednom točkom.

Zamjenski znak točke je koristan, ali može uzrokovati probleme ako ga imate kao dio teksta koji tražite.

Na primjer, pogledajte ovaj popis naziva domena.

  • 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

Da biste pronašli sve URL-ove lifewire.com, samo pretražite pomoću sljedeće sintakse:

grep .com imena domena. 

Gornja bi naredba pala ako bi popis sadržavao sljedeće ime:

everydaylinuxuser.com. 

Stoga možete isprobati sljedeću sintaksu:

grep lifewire.com imena domena. 

Ovo bi dobro funkcioniralo osim ako ne postoji domena sa sljedećim imenom:

fakesite.lifewire1com.com. 

Da biste stvarno tražili pojam lifewire.com, trebali biste pobjeći od točke na sljedeći način:

grep lifewire\\.com imena domena. 

Posljednji zamjenski znak koji vam treba pokazati je upitnik koji označava nulu ili jedan znak.

Na primjer:

grep -E ?ber imena mjesta. 

Gornja naredba bi vratila aberdeen, aberystwyth ili čak berwick, da je na popisu. Primijetite i dodatnu '-E' zastavicu. Grep neće prepoznati? znak bez da omogući proširenu podršku regularnog izraza.

Potražite nizove na početku i na kraju retka pomoću grep

Simbol karat (^) i dolar ($) omogućuju vam traženje uzoraka na početku i na kraju redaka.

Zamislite da imate datoteku pod nazivom nogomet sa sljedećim nazivima momčadi:

  • Blackpool
  • Liverpool
  • Manchester City
  • Leicester City
  • Manchester United
  • Newcastle United
  • FC United of Manchester

Ako želite pronaći sve timove koji su započeli s Manchesterom, upotrijebili biste sljedeću sintaksu:

grep ^Manchesterski timovi. 

Gornja naredba bi vratila Manchester City i Manchester United, ali ne i FC United Of Manchester.

Alternativno, možete pronaći sve timove koji završavaju s United koristeći sljedeću sintaksu:

grep United$ timovi. 

Gornja komanda bi se vratila u Manchester United i Newcastle United, ali ne i u FC United Of Manchester.

Brojanje broja podudaranja pomoću grep

Ako ne želite vratiti stvarne linije koje odgovaraju uzorku koristeći grep, ali samo želite znati koliko ih ima, možete koristiti sljedeću sintaksu:

grep -c ulazna datoteka uzorka. 

Ako je uzorak dvaput uparen tada bi se vratio broj 2.

Pronalaženje svih pojmova koji se ne podudaraju pomoću grep

Zamislite da imate popis naziva mjesta sa zemljama navedenim na sljedeći način:

  • aberdeenska Škotska
  • glasgow Škotska
  • liverpool Engleska
  • zaljev colwyn
  • London, Engleska

Možda ste primijetili da zaljev Colwyn nema povezanu zemlju s njim.

Za traženje svih mjesta sa zemljom možete koristiti sljedeću sintaksu:

grep land$ mjesta. 

Rezultati bi se vratili na sva mjesta osim za zaljev Colwyn.

Ovo očito funkcionira samo za mjesta koja završavaju kopnom (teško da znanstveno).

Možete invertirati odabir koristeći sljedeću sintaksu:

grep -v zemlja$ mjesta. 

Ovo će pronaći sva mjesta koja ne završavaju sa zemljom.

Kako pronaći prazne linije u datotekama koristeći grep

Zamislite da imate ulaznu datoteku koju koristi aplikacija treće strane koja prestaje čitati datoteku kada pronađe prazan red kako slijedi:

  • aberdeenska škotska
  • inverness škotska
  • liverpool engleska
  • Colwyn Bay Wales

Kada aplikacija dođe na red nakon liverpoola, prestat će čitati što znači da je colwyn bay potpuno propušten.

Možete koristiti grep za traženje praznih redaka sa sljedećom sintaksom:

grep ^$ mjesta. 

Ovo nije osobito korisno jer samo vraća prazne retke.

Možete, naravno, dobiti broj praznih redaka kao provjeru da li je datoteka valjana na sljedeći način:

grep -c ^$ mjesta. 

Međutim, bilo bi korisnije znati brojeve redaka koji imaju prazan redak kako biste ih mogli zamijeniti. To možete učiniti sljedećom naredbom:

grep -n ^$ mjesta. 

Kako tražiti nizove velikih ili malih znakova pomoću grep

Koristeći grep možete odrediti koji redovi u datoteci imaju velika slova koristeći sljedeću sintaksu:

grep '[A-Z]' naziv datoteke. 

Uglate zagrade [] omogućuju vam da odredite raspon znakova. U gornjem primjeru, odgovara bilo kojem znaku koji je između A i Z.

Stoga za podudaranje znakova malih slova možete koristiti sljedeću sintaksu:

grep '[a-z]' naziv datoteke. 

Ako želite spojiti samo slova, a ne brojeve ili druge simbole, možete koristiti sljedeću sintaksu:

grep '[a-zA-Z]' naziv datoteke. 

Isto možete učiniti s brojevima na sljedeći način:

grep '[0-9]' naziv datoteke. 

Traženje obrazaca koji se ponavljaju pomoću grep

Možete koristiti vitičaste zagrade {} za traženje uzorka koji se ponavlja.

Zamislite da imate datoteku s telefonskim brojevima kako slijedi:

  • 055-1234
  • 055-4567
  • 555-1545
  • 444-0167
  • 444-0854
  • 4549-2234
  • x44-1234

Znate da prvi dio broja mora biti tri znamenke i želite pronaći retke koji ne odgovaraju ovom uzorku.

Iz prethodnog primjera znate da [0-9] vraća sve brojeve u datoteci.

U ovom slučaju, želimo retke koji počinju s tri broja iza kojih slijedi crtica (-). To možete učiniti sa sljedećom sintaksom:

grep "^[0-9][0-9][0-9]-" brojevi. 

Kao što znamo iz prethodnih primjera, karat (^) znači da linija mora početi sljedećim uzorkom.

[0-9] će tražiti bilo koji broj između 0 i 9. Kako je ovo uključeno tri puta, odgovara 3 broja. Konačno, postoji crtica koja označava da crtica mora slijediti tri broja.

Korištenjem vitičastih zagrada možete smanjiti pretraživanje na sljedeći način:

grep "^[0-9]\{3\}-" brojevi. 

Kosa crta izbjegava zagradu { tako da radi kao dio regularnog izraza, ali u biti ono što ovo govori je [0-9]{3} što znači bilo koji broj između 0 i 9 tri puta.

Kovrčave zagrade se također mogu koristiti na sljedeći način:

{5,10}
{5,}

{5,10} znači da se znak koji se traži mora ponoviti najmanje 5 puta, ali ne više od 10 dok {5,} znači da se znak mora ponoviti najmanje 5 puta, ali može biti više od da.

Korištenje izlaza iz drugih naredbi Korištenje grep

Do sada smo promatrali podudaranje uzoraka unutar pojedinačnih datoteka, ali grep može koristiti izlaz iz drugih naredbi kao ulaz za podudaranje uzoraka.

Sjajan primjer za to je korištenje naredbe ps koja navodi aktivne procese.

Na primjer, pokrenite sljedeću naredbu:

ps -ef. 

Prikazat će se svi pokrenuti procesi na vašem sustavu.

Možete koristiti grep za traženje određenog procesa koji se izvodi na sljedeći način:

ps -ef | grep firefox. 

Sažetak

Naredba grep je temeljna Linux naredbu i to je ona koju vrijedi naučiti jer će vam uvelike olakšati život pri traženju datoteka i procesa pri korištenju terminala.