Primer uporabe ukaza grep za Linux

Ukaz grep v Linuxu se uporablja kot metoda za filtriranje vnosa. GREP je kratica za Global Regular Expression Printer in zato, da bi ga lahko učinkovito uporabljali, bi morali imeti nekaj znanja o regularnih izrazih.

V tem članku boste izvedeli številne primere, ki vam bodo pomagali razumeti ukaz grep.

Kako poiskati niz v datoteki z uporabo GREP

Ročni posnetek zaslona ukaza grep za Linux

Predstavljajte si, da imate besedilno datoteko, imenovano knjige, z naslednjimi naslovi otroških knjig:

  • Robin Hood
  • Rdeča kapica
  • Peter Pan
  • Zlatolaska in trije medvedi
  • Sneguljčica in sedem palčkov
  • Pinnochio
  • Mačka v klobuku
  • Trije prašički
  • Gruffalo
  • Charlie in tovarna čokolade

Če želite najti vse knjige z besedo "The" v naslovu, uporabite naslednjo sintakso:

grep Knjige. 

Vrnjeni bodo naslednji rezultati:

Zlatolaska in trije medvedi
Sneguljčica in sedem palčkov
Mačka v klobuku
Trije prašički
Gruffalo
Charlie in tovarna čokolade.

V vsakem primeru bo poudarjena beseda "The".

Iskanje je občutljivo na velike in male črke, tako da če bi imel eden od naslovov "the" namesto "The", potem ne bi bil vrnjen.

Če želite prezreti črko, lahko dodate naslednje stikalo:

grep the books --ignore-case. 

Stikalo -i lahko uporabite tudi na naslednji način:

grep -i knjige. 

Poiščite niz v datoteki z uporabo regularnih izrazov

Ukaz grep je zelo močan. Za filtriranje rezultatov lahko uporabite številne tehnike ujemanja vzorcev.

V tem primeru vam bomo pokazali, kako poiskati niz v datoteki z uporabo nadomestnih znakov.

Predstavljajte si, da imate datoteko z imenom places z naslednjimi škotskimi imeni krajev:

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

Če želite najti vsa mesta z inver v imenu, uporabite naslednjo sintakso:

grep inver* mesta. 

Znak zvezdica (*) ne deluje tako kot v običajnem Bashu. V kontekstu grep, ki obravnava regularne izraze, se zvezdica obnaša drugače. Namesto da se ujema kateri koli znak ali noben znak, kot je Bash, se ujema z vnesenim vzorcem in kakršnimi koli nadaljnjimi ponovitvami tega vzorca ali brez njih.

V zgornjem primeru se ujema:

inverurie
inverness.

ker oba vsebujeta vzorec "inver", kot je vnesen, plus nič dodatnih ponovitev tega vzorca. Če želite to spet bolj jasno videti, dodajte:

repeatinverinverinver. 

na seznam. Ne, nima veliko smisla, vendar bo pokazal, kako deluje zvezdica. Poskusite znova zagnati ukaz.

grep inver* mesta.

Ali vidite novo linijo? To v Bashu ne bi delovalo, tukaj pa deluje.

Da bodo stvari še bolj nenavadne, zaženite ukaz brez zvezdice.

grep inver mesta. 

Rezultati so enaki. Grep bo privzeto iskal vzorec na katerem koli mestu, kjer je prikazan v nizu besedila. Tudi ne razlikuje, kolikokrat se pojavi.

Drugi nadomestni znak, ki ga lahko uporabite, je pika (.). To lahko uporabite za ujemanje ene črke.

grep inver.r mesta. 

Zgornji ukaz bi našel mesta, imenovana inverurie in inverary, vendar ne bi našel invereerie, ker je med obema r lahko samo en nadomestni znak, kot je označeno z eno piko.

Nadomestni znak za piko je uporaben, vendar lahko povzroči težave, če ga imate kot del besedila, ki ga iščete.

Oglejte si na primer ta seznam imen domen.

  • 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

Če želite najti vse URL-je lifewire.com, lahko preprosto iščete z naslednjo sintakso:

imena domen grep .com. 

Zgornji ukaz bi padel navzdol, če bi seznam vseboval naslednje ime:

everydaylinuxuser.com. 

Zato lahko poskusite z naslednjo sintakso:

imena domen grep lifewire.com. 

To bi delovalo v redu, razen če bi obstajala domena z naslednjim imenom:

fakesite.lifewire1com.com. 

Če želite zares poiskati izraz lifewire.com, bi se morali iz pike izogniti na naslednji način:

grep lifewire\\.com domen. 

Zadnji nadomestni znak, ki vam ga je treba pokazati, je vprašaj, ki pomeni nič ali en znak.

Na primer:

grep -E ?ber imena krajev. 

Zgornji ukaz bi vrnil aberdeen, aberystwyth ali celo berwick, če bi bil na seznamu. Opazite tudi dodatno zastavico '-E'. Grep ne bo prepoznal? znak, ne da bi omogočil razširjeno podporo za regularne izraze.

Poiščite nize na začetku in koncu vrstice z uporabo grep

Simbol za karat (^) in dolar ($) omogočata iskanje vzorcev na začetku in koncu vrstic.

Predstavljajte si, da imate datoteko nogomet z naslednjimi imeni ekip:

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

Če bi želeli poiskati vse ekipe, ki so začele z Manchestrom, bi uporabili naslednjo sintakso:

grep ^ Manchester teams. 

Zgornji ukaz bi vrnil Manchester City in Manchester United, ne pa tudi FC United Of Manchester.

Lahko pa najdete tudi vse ekipe, ki se končajo z United z naslednjo sintakso:

grep United$ ekipe. 

Zgornji ukaz bi se vrnil v Manchester United in Newcastle United, ne pa v FC United Of Manchester.

Štetje števila zadetkov z uporabo grep

Če ne želite vrniti dejanskih vrstic, ki se ujemajo z vzorcem z uporabo grep, vendar želite le vedeti, koliko jih je, lahko uporabite naslednjo sintakso:

grep -c vhodna datoteka vzorca. 

Če se vzorec ujema dvakrat, se vrne številka 2.

Iskanje vseh izrazov, ki se ne ujemajo z uporabo grep

Predstavljajte si, da imate seznam imen krajev z naslednjimi državami:

  • aberdeenska škotska
  • glasgow Škotska
  • liverpool Anglija
  • zaliv Colwyn
  • london Anglija

Morda ste opazili, da zaliv Colwyn nima nobene povezane države.

Za iskanje vseh krajev z državo lahko uporabite naslednjo sintakso:

grep land$ mesta. 

Rezultati bi bili vsi kraji, razen zaliv Colwyn.

To očitno deluje samo za kraje, ki se končajo na kopnem (komaj znanstveno).

Izbor lahko obrnete z naslednjo sintakso:

grep -v land$ mesta. 

Tako bi našli vse kraje, ki se ne končajo z zemljo.

Kako najti prazne vrstice v datotekah z uporabo grep

Predstavljajte si, da imate vhodno datoteko, ki jo uporablja aplikacija tretje osebe, ki preneha brati datoteko, ko najde prazno vrstico, kot sledi:

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

Ko aplikacija pride na vrsto po liverpoolu, bo prenehala brati, kar pomeni, da je zaliv colwyn v celoti zgrešen.

Za iskanje praznih vrstic lahko uporabite grep z naslednjo sintakso:

grep ^$ mesta. 

To ni posebej uporabno, ker vrne le prazne vrstice.

Seveda lahko dobite štetje števila praznih vrstic kot preverjanje, ali je datoteka veljavna, kot sledi:

grep -c ^$ mesta. 

Vendar bi bilo bolj koristno vedeti številke vrstic, ki imajo prazno vrstico, da jih lahko zamenjate. To lahko storite z naslednjim ukazom:

grep -n ^$ mesta. 

Kako poiskati nize velikih ali malih črk z uporabo grep

Z uporabo grep lahko določite, katere vrstice v datoteki imajo velike črke z uporabo naslednje sintakse:

grep '[A-Z]' ime datoteke. 

Oglati oklepaji [] vam omogočajo določitev obsega znakov. V zgornjem primeru se ujema s katerim koli znakom, ki je med A in Z.

Zato lahko za ujemanje z malimi črkami uporabite naslednjo sintakso:

grep '[a-z]' ime datoteke. 

Če želite ujemati samo črke in ne številk ali drugih simbolov, lahko uporabite naslednjo sintakso:

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

Enako lahko storite s številkami, kot sledi:

grep '[0-9]' ime datoteke. 

Iskanje ponavljajočih se vzorcev z uporabo grep

Za iskanje ponavljajočega se vzorca lahko uporabite kodraste oklepaje {}.

Predstavljajte si, da imate datoteko s telefonskimi številkami, kot sledi:

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

Veste, da mora biti prvi del števila trimestne in želite najti vrstice, ki se ne ujemajo s tem vzorcem.

Iz prejšnjega primera veste, da [0-9] vrne vse številke v datoteki.

V tem primeru želimo vrstice, ki se začnejo s tremi številkami, ki jim sledi vezaj (-). To lahko storite z naslednjo sintakso:

grep "^[0-9][0-9][0-9]-" številke. 

Kot vemo iz prejšnjih primerov, karat (^) pomeni, da se mora vrstica začeti z naslednjim vzorcem.

[0-9] bo iskal poljubno število med 0 in 9. Ker je to vključeno trikrat, se ujema s 3 številkami. Nazadnje je vezaj, ki označuje, da mora vezaj slediti trem številkam.

Z uporabo kodrastih oklepajev lahko iskanje zmanjšate na naslednji način:

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

Poševnica ubeži oklepaju {, tako da deluje kot del regularnega izraza, v bistvu pa to pove [0-9]{3}, kar pomeni katero koli število med 0 in 9 trikrat.

Kodraste oklepaje lahko uporabite tudi na naslednji način:

{5,10}
{5,}

{5,10} pomeni, da je treba iskani znak ponoviti vsaj 5-krat, vendar ne več kot 10, medtem ko {5,} pomeni, da je treba znak ponoviti vsaj 5-krat, vendar je lahko več kot to

Uporaba izhoda iz drugih ukazov Uporaba grep

Do sedaj smo si ogledali ujemanje vzorcev znotraj posameznih datotek, vendar grep lahko uporabi izhod drugih ukazov kot vhod za ujemanje vzorcev.

Odličen primer tega je uporaba ukaza ps, ki navaja aktivne procese.

Zaženite na primer naslednji ukaz:

ps -ef. 

Prikazani bodo vsi procesi, ki se izvajajo v vašem sistemu.

Za iskanje določenega tekočega procesa lahko uporabite grep, kot sledi:

ps -ef | grep firefox. 

Povzetek

Ukaz grep je temeljni Linux ukaz in je tisti, ki se ga je vredno naučiti, saj vam bo zelo olajšal življenje pri iskanju datotek in procesov pri uporabi terminala.