Kako se koristi naredba grep na Linuxu

Linux grepnaredba je uslužni program za podudaranje niza i uzorka koji prikazuje odgovarajuće retke iz više datoteka. Također radi s cijevnim izlazom iz drugih naredbi. Pokazujemo vam kako.

Priča iza grepa

grepNaredba je poznata u Linux i Unix krugovima zbog tri razloga. Prvo, izuzetno je korisno. Drugo, bogatstvo opcija može biti neodoljivo. Treće, napisano je preko noći kako bi udovoljilo određenoj potrebi. Prva dva udaraju; treći je malo isključen.

Ken Thompson izvukao je iz programa za eduređivanje mogućnosti regularnog izraza (izgovara se ee-dee) i stvorio mali program - za vlastitu upotrebu - za pretraživanje tekstualnih datoteka. Njegov šef odjela u laboratoriju Bell, Doug Mcilroy, obratio se Thompsonu i opisao problem s kojim se suočio jedan od njegovih kolega, Lee McMahon.

McMahon je pokušavao identificirati autore federalističkih radova tekstualnom analizom. Trebao mu je alat koji može pretraživati ​​fraze i nizove unutar tekstualnih datoteka. Thompson je proveo otprilike sat vremena te večeri praveći svoj alat od općeg alata koji bi mogli koristiti drugi i preimenovao ga u grep. Ime je preuzeo iz ednaredbenog niza g/re/p, što se prevodi kao "globalno pretraživanje regularnih izraza".

Možete gledati Thompsona kako razgovara s Brianom Kernighanom o rođenju grep.

Jednostavna pretraživanja s grepom

Da biste pretražili niz unutar datoteke, u naredbeni redak dodajte pojam za pretraživanje i naziv datoteke:

Prikazuju se odgovarajuće linije. U ovom slučaju to je jedan redak. Oznaka za podudaranje je istaknuta. To je zato što je na većini distribucija grepalias:

alias grep = "grep --colour = auto"

Pogledajmo rezultate gdje postoji više linija koje se podudaraju. Tražit ćemo riječ "Prosjek" u datoteci dnevnika aplikacije. Budući da se ne možemo prisjetiti je li riječ malim slovima u datoteci dnevnika, upotrijebit ćemo opciju -i (zanemari velika i mala slova):

grep -i Prosječni geek-1.log

Prikazuje se svaki odgovarajući redak, s odgovarajućim tekstom istaknutim u svakom.

Linije koje se ne podudaraju možemo prikazati pomoću opcije -v (obrnuto podudaranje).

grep -v Mem geek-1.log

Nema isticanja jer su to linije koje se ne podudaraju.

Možemo uzrokovati greppotpuno šutnju. Rezultat se prenosi ljusci kao povratna vrijednost iz grep. Rezultat nula znači string je pronađen, a rezultat je jedan način da nije pronađen. Povratni kod možemo provjeriti pomoću  $?posebnih parametara:

grep -q prosječni geek-1.log
jeka $?
grep -q howtogeek geek-1.log
jeka $?

Rekurzivna pretraživanja s grep

Za pretraživanje ugniježđenih direktorija i poddirektorijuma upotrijebite opciju -r (rekurzivna). Imajte na umu da na naredbenom retku ne navodite ime datoteke, morate unijeti put. Ovdje tražimo u trenutnom direktoriju "." i bilo koji poddirektorij:

grep -r -i memfree.

Izlaz uključuje direktorij i naziv datoteke svakog odgovarajućeg retka.

Možemo  grep  slijediti simboličke poveznice pomoću opcije -R(rekurzivna preusmjeravanja). U ovom direktoriju imamo simboličku poveznicu koja se zove logs-folder. Ukazuje na /home/dave/logs.

ls -l evidencija-mapa

Ponovimo svoje posljednje pretraživanje s  -Ropcijom (rekurzivna preusmjeravanja):

grep -R -i memfree.

Prati se simbolična veza i pretražuje se i direktorij na koji upućuje grep.

Traženje cijelih riječi

Prema zadanim postavkama, greppodudarat će se s retkom ako se cilj pretraživanja pojavi bilo gdje u tom retku, uključujući unutar drugog niza. Pogledajte ovaj primjer. Tražit ćemo riječ "besplatno".

grep -i free geek-1.log

Rezultati su crte u kojima je niz "slobodan", ali to nisu zasebne riječi. Oni su dio niza "MemFree".

Da biste prisilili grep podudaranje samo zasebnih "riječi", upotrijebite opciju -w(regularni izraz riječi).

grep -w -i slobodan geek-1.log
jeka $?

Ovaj put nema rezultata jer se pojam za pretraživanje "besplatno" ne pojavljuje u datoteci kao zasebna riječ.

Korištenje višestrukih pojmova za pretraživanje

Opcija -E(prošireni regexp) omogućuje vam traženje više riječi. ( -EOpcija zamjenjuje zastarjelu egrepverziju grep.)

Ova naredba traži dva pojma za pretraživanje, "prosjek" i "memfree".

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

Sve odgovarajuće linije prikazane su za svaki od pojmova za pretraživanje.

Također možete tražiti više pojmova koji nisu nužno cijele riječi, ali mogu biti i cijele riječi.

Opcija -e(uzorci) omogućuje vam upotrebu više pojmova za pretraživanje na naredbenom retku. Koristimo značajku zagrade regularnog izraza za stvaranje obrasca pretraživanja. Kaže grepda se podudara s bilo kojim od znakova sadržanih u zagradama "[]." To znači da grepće se tijekom pretraživanja podudarati s "kB" ili "KB".

Oba se niza podudaraju, a zapravo neki retci sadrže oba niza.

Točno podudaranje linija

-x(Linija reg) će se uzeti samo linije gdje se cijela linija odgovara pojmu za pretraživanje. Potražimo datum i vrijeme za koje znamo da se pojavljuju samo jednom u datoteci dnevnika:

grep -x "20. siječnja - 6. 15:24:35" geek-1.log

Pronađen je i prikazan jedan redak koji se podudara.

Suprotno od toga je samo pokazivanje linija koje se ne podudaraju. To može biti korisno kada gledate konfiguracijske datoteke. Komentari su sjajni, ali ponekad je teško među njima prepoznati stvarne postavke. Evo /etc/sudoersdatoteke:

Učinkovito možemo filtrirati retke komentara poput ovog:

sudo grep -v "#" / etc / sudoers

To je puno lakše raščlaniti.

Prikazuje se samo odgovarajući tekst

Možda postoji prilika kada ne želite vidjeti cijeli podudarni redak, samo odgovarajući tekst. Opcija -o(samo podudaranje) čini upravo to.

grep -o MemFree geek-1.log

Zaslon se svodi na prikazivanje samo teksta koji odgovara pojmu za pretraživanje, umjesto cijelog odgovarajućeg retka.

Brojanje S grepom

grepne radi se samo o tekstu, on može pružiti i numeričke informacije. Za nas možemo grepračunati na različite načine. Ako želimo znati koliko se puta pojam za pretraživanje pojavljuje u datoteci, možemo koristiti opciju -c(count).

grep -c prosječni geek-1.log

grep izvještava da se pojam za pretraživanje u ovoj datoteci pojavljuje 240 puta.

Možete napraviti grepprikaz broja retka za svaki odgovarajući redak pomoću opcije -n(broj linije).

grep -n Jan geek-1.log

Broj retka za svaki odgovarajući redak prikazuje se na početku retka.

Da biste smanjili broj prikazanih rezultata, upotrijebite opciju -m(maks. Broj). Izlaz ćemo ograničiti na pet odgovarajućih linija:

grep -m5 -n Jan geek-1.log

Dodavanje konteksta

Često je korisno vidjeti neke dodatne crte - možda nepodudarajuće - za svaku podudarnu liniju. može vam pomoći razlikovati koje su od podudarnih linija one koje vas zanimaju.

Da biste prikazali neke retke nakon odgovarajuće linije, upotrijebite opciju -A (nakon konteksta). U ovom primjeru tražimo tri retka:

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

Da biste vidjeli neke retke prije odgovarajuće linije, upotrijebite opciju -B(kontekst prije).

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

A da biste uključili retke prije i nakon odgovarajuće linije, koristite opciju -C(context).

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

Prikazuju se odgovarajuće datoteke

Da biste vidjeli imena datoteka koje sadrže pojam za pretraživanje, upotrijebite opciju -l (datoteke s podudaranjem). Da biste saznali koje datoteke izvornog koda C sadrže reference na sl.hdatoteku zaglavlja, upotrijebite ovu naredbu:

grep -l "sl.h" * .c

Navedeni su nazivi datoteka, a ne odgovarajuće linije.

I naravno, možemo potražiti datoteke koje ne sadrže pojam za pretraživanje. Opcija -L(datoteke bez podudaranja) čini upravo to.

grep -L "sl.h" * .c

Početak i kraj linija

Možemo prisiliti grepprikazivanje samo podudarnosti koja su ili na početku ili na kraju retka. Operator regularnog izraza „^“ podudara se s početkom retka. Praktički će svi redovi unutar datoteke dnevnika sadržavati razmake, ali tražit ćemo retke kojima je razmak kao prvi znak:

grep "^" geek-1.log

Prikazuju se linije koje imaju razmak kao prvi znak - na početku retka.

Da biste se podudarali s krajem retka, upotrijebite operator regularnog izraza "$". Tražit ćemo redove koji se završavaju s "00".

grep "00 $" geek-1.log

Na zaslonu se prikazuju redovi koji kao posljednji znak imaju "00".

Korištenje cijevi s grep

Naravno, možete usmjeriti ulaz u grep, izvod grepizvesti u drugi program i grepsmjestiti se usred cijevnog lanca.

Recimo da želimo vidjeti sve pojave niza “ExtractParameters” u našim C izvornim datotekama. Znamo da će ih biti prilično puno, pa izlaz usmjeravamo u less:

grep "ExtractParameters" * .c | manje

Rezultat je predstavljen u less.

To vam omogućuje listanje popisa datoteka i korištenje less'spogona za pretraživanje.

Ako cijev izlaz iz grepu wci korištenje -l(linije) opciju, možemo računati broj redaka u izvornom kodu datoteka koje sadrže „ExtractParameters”. (To bismo mogli postići pomoću opcije grep-c(count), ali ovo je lijep način za demonstriranje cjevovoda iz grep.)

grep "ExtractParameters" * .c | wc -l

Sa sljedeću naredbu, mi smo cijevi izlaz iz lsu grepi cijevi izlaz iz grepu sort. Datoteke navodimo u trenutni direktorij, odabiremo one s nizom "Aug" i sortiramo ih prema veličini datoteke:

ls -l | grep "kolovoz" | sortiraj + 4n

Razdvojimo to:

  • ls -l : Izvršite popis datoteka u dugom formatu pomoću ls.
  • grep "Aug" : Odaberite retke s lspopisa koji sadrže "Aug". Imajte na umu da bi se također pronašle datoteke koje u svom nazivu imaju "Aug".
  • sort + 4n : Sortiranje rezultata iz grep-a u četvrtom stupcu (veličina datoteke).

Dobivamo sortirani popis svih datoteka izmijenjenih u kolovozu (bez obzira na godinu), rastućim redoslijedom veličine datoteke.

POVEZANO: Kako koristiti cijevi na Linuxu

grep: Manje zapovijed, više saveznik

grepje sjajan alat koji vam stoji na raspolaganju. Potječe iz 1974. godine i još uvijek je snažna jer nam treba ono što radi, a ništa ne čini bolje.

Spajanje greps nekim regularnim izrazima-fu stvarno ga podiže na sljedeću razinu.

POVEZANO: Kako koristiti osnovne regularne izraze za bolje pretraživanje i uštedu vremena