Eksempel på bruk av Linux grep-kommandoen

Linux grep-kommandoen brukes som en metode for å filtrere inndata. GREP står for Global Regular Expression Printer og derfor bør du ha litt kunnskap om regulære uttrykk for å kunne bruke den effektivt.

I denne artikkelen vil du lære en rekke eksempler som vil hjelpe deg å forstå grep-kommandoen.

Hvordan søke etter en streng i en fil ved hjelp av GREP

Det manuelle skjermbildet for Linux grep Command

Tenk deg at du har en tekstfil kalt bøker med følgende barneboktitler:

  • Robin Hood
  • Rødhette
  • Peter Pan
  • Gullhår og de tre bjørnene
  • Snøhvit og de syv dvergene
  • Pinnochio
  • Katten i hatten
  • De tre små griser
  • Gruffalo
  • Charlie og sjokoladefabrikken

For å finne alle bøkene med ordet "The" i tittelen bruker du følgende syntaks:

grep Bøkene. 

Følgende resultater vil bli returnert:

Gullhår og de tre bjørnene
Snøhvit og de syv dvergene
Katten i hatten
De tre små griser
Gruffalo
Charlie og sjokoladefabrikken.

I hvert tilfelle vil ordet "The" bli uthevet.

Søket skiller mellom store og små bokstaver, så hvis en av titlene hadde "the" i stedet for "The", ville den ikke blitt returnert.

For å ignorere saken kan du legge til følgende bryter:

grep bøkene --ignore-case. 

Du kan også bruke -i-bryteren som følger:

grep -i bøkene. 

Søk etter en streng i en fil ved hjelp av regulære uttrykk

grep-kommandoen er veldig kraftig. Du kan bruke en rekke mønstertilpasningsteknikker for å filtrere resultater.

I dette eksemplet vil vi vise deg hvordan du søker etter en streng i en fil ved hjelp av jokertegn.

Tenk deg at du har en fil kalt steder med følgende skotske stedsnavn:

aberdeen
aberystwyth
aberlour
inverurie
inverness
newburgh
ny hjort
ny galloway
Glasgow
edinburgh.

Hvis du vil finne alle stedene med inver i navnet, bruk følgende syntaks:

grep inver* steder. 

Asterisk (*)-tegnet fungerer ikke helt som det gjør i vanlig Bash. I sammenheng med grep, som omhandler regulære uttrykk, oppfører stjernen seg annerledes. I stedet for å matche noen eller ingen tegn, som det Bash, matcher den det angitte mønsteret pluss eventuelle eller ingen påfølgende repetisjoner av det mønsteret.

I eksemplet ovenfor samsvarer det med:

inverurie
inverness.

fordi de begge inneholder mønsteret "inver" som angitt pluss null ekstra repetisjoner av det mønsteret. For å se dette tydeligere igjen, legg til:

repeatinverinverinver. 

til listen. Nei, det gir ikke mye mening, men det vil demonstrere hvordan stjernen fungerer. Prøv å kjøre kommandoen på nytt.

grep inver* steder.

Ser du den nye linjen? Det ville ikke fungere i Bash, men det gjør det her.

For å gjøre ting enda merkeligere, kjør kommandoen uten stjerne.

grep inver steder. 

Resultatene er de samme. Som standard vil grep se etter et mønster hvor som helst det vises i en tekststreng. Det skiller heller ikke hvor mange ganger det vises.

Et annet jokertegn du kan bruke er punktum (.). Du kan bruke dette til å matche en enkelt bokstav.

grep inver.r steder. 

Kommandoen ovenfor ville finne steder kalt inverurie og inverary, men ville ikke finne invereerie fordi det bare kan være ett jokertegn mellom de to r-ene som angitt med enkeltperioden.

Periode-jokertegnet er nyttig, men det kan skape problemer hvis du har et som en del av teksten du søker.

Se for eksempel på denne listen over domenenavn.

  • 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

For å finne alle lifewire.com-URL-ene kan du bare søke med følgende syntaks:

grep .com domenenavn. 

Kommandoen ovenfor ville falle ned hvis listen inneholdt følgende navn:

everydaylinuxuser.com. 

Du kan derfor prøve følgende syntaks:

grep lifewire.com domenenavn. 

Dette ville fungere bra med mindre det var et domene med følgende navn:

fakesite.lifewire1com.com. 

For å virkelig søke etter begrepet lifewire.com må du unnslippe prikken som følger:

grep lifewire\\.com domenenavn. 

Det siste jokertegnet for å vise deg er spørsmålstegnet som står for null eller ett tegn.

For eksempel:

grep -E ?ber stedsnavn. 

Kommandoen ovenfor ville returnert aberdeen, aberystwyth eller til og med berwick, hvis den var på listen. Legg også merke til det ekstra '-E'-flagget. Grep vil ikke gjenkjenne? tegn uten at det muliggjør utvidet støtte for regulære uttrykk.

Søk etter strenger på begynnelsen og slutten av linjen ved å bruke grep

Karat (^) og dollar ($)-symbolet lar deg søke etter mønstre på begynnelsen og slutten av linjer.

Tenk deg at du har en fil som heter fotball med følgende lagnavn:

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

Hvis du ønsket å finne alle lagene som begynte med Manchester, ville du bruke følgende syntaks:

grep ^Manchester-lag. 

Kommandoen ovenfor ville returnere Manchester City og Manchester United, men ikke FC United of Manchester.

Alternativt kan du finne alle lagene som slutter med United ved å bruke følgende syntaks:

grep United$-lag. 

Kommandoen ovenfor ville returnere til Manchester United og Newcastle United, men ikke FC United of Manchester.

Telle antall treff ved hjelp av grep

Hvis du ikke vil returnere de faktiske linjene som samsvarer med et mønster ved å bruke grep, men du bare vil vite hvor mange det er, kan du bruke følgende syntaks:

grep -c mønsterinndatafil. 

Hvis mønsteret ble matchet to ganger, ville tallet 2 bli returnert.

Finne alle vilkårene som ikke stemmer med grep

Tenk deg at du har en liste over stedsnavn med landene oppført som følger:

  • aberdeen Skottland
  • Glasgow Skottland
  • Liverpool England
  • colwyn bay
  • London, England

Du har kanskje lagt merke til at Colwyn Bay ikke har noe land knyttet til seg.

For å søke etter alle stedene med et land kan du bruke følgende syntaks:

grep land$ steder. 

Resultatene vil være alle stedene bortsett fra Colwyn Bay.

Dette fungerer åpenbart bare for steder som ender i land (neppe vitenskapelig).

Du kan invertere utvalget ved å bruke følgende syntaks:

grep -v land$ steder. 

Dette ville finne alle stedene som ikke endte med land.

Hvordan finne tomme linjer i filer ved hjelp av grep

Tenk deg at du har en inndatafil som brukes av et tredjepartsprogram som slutter å lese filen når den finner en tom linje som følger:

  • Aberdeen Skottland
  • inverness skottland
  • liverpool england
  • colwyn bay wales

Når applikasjonen kommer til linjen etter Liverpool, vil den slutte å lese, noe som betyr at Colwyn Bay er savnet helt.

Du kan bruke grep til å søke etter tomme linjer med følgende syntaks:

grep ^$ steder. 

Dette er ikke spesielt nyttig fordi det bare returnerer de tomme linjene.

Du kan selvfølgelig få en telling av antall tomme linjer som en sjekk for å se om filen er gyldig som følger:

grep -c ^$ steder. 

Det ville imidlertid være mer nyttig å vite linjenumrene som har en tom linje, slik at du kan erstatte dem. Du kan gjøre det med følgende kommando:

grep -n ^$ steder. 

Hvordan søke etter strenger med store eller små bokstaver ved hjelp av grep

Ved å bruke grep kan du bestemme hvilke linjer i en fil som har store tegn ved å bruke følgende syntaks:

grep '[A-Z]' filnavn. 

De firkantede parentesene [] lar deg bestemme rekkevidden av tegn. I eksemplet ovenfor samsvarer det med alle tegn som er mellom A og Å.

Derfor kan du bruke følgende syntaks for å matche små bokstaver:

grep '[a-z]' filnavn. 

Hvis du bare vil matche bokstaver og ikke tall eller andre symboler, kan du bruke følgende syntaks:

grep '[a-zA-Z]' filnavn. 

Du kan gjøre det samme med tall som følger:

grep '[0-9]' filnavn. 

Ser etter repeterende mønstre ved å bruke grep

Du kan bruke krøllede parenteser {} for å søke etter et gjentatt mønster.

Tenk deg at du har en fil med telefonnumre som følger:

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

Du vet at den første delen av tallet må være tresifret, og du vil finne linjene som ikke samsvarer med dette mønsteret.

Fra forrige eksempel vet du at [0-9] returnerer alle tallene i en fil.

I dette tilfellet vil vi ha linjene som starter med tre tall etterfulgt av en bindestrek (-). Du kan gjøre det med følgende syntaks:

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

Som vi vet fra tidligere eksempler betyr karaten (^) at linjen må begynne med følgende mønster.

[0-9] vil søke etter et hvilket som helst tall mellom 0 og 9. Siden dette er inkludert tre ganger, samsvarer det med 3 tall. Til slutt er det en bindestrek for å angi at en bindestrek må etterfølge de tre tallene.

Ved å bruke de krøllede parentesene kan du gjøre søket mindre som følger:

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

Skråstreken unnslipper { parentesen slik at den fungerer som en del av det regulære uttrykket, men i hovedsak er det dette sier [0-9]{3} som betyr et hvilket som helst tall mellom 0 og 9 tre ganger.

De krøllede brakettene kan også brukes som følger:

{5,10}
{5,}

{5,10} betyr at tegnet det søkes etter må gjentas minst 5 ganger, men ikke mer enn 10 mens {5,} betyr at tegnet må gjentas minst 5 ganger, men det kan være mer enn at.

Bruke utdata fra andre kommandoer ved å bruke grep

Så langt har vi sett på mønstertilpasning i individuelle filer, men grep kan bruke utdata fra andre kommandoer som input for mønstertilpasning.

Et godt eksempel på dette er å bruke ps-kommandoen som viser aktive prosesser.

Kjør for eksempel følgende kommando:

ps -ef. 

Alle de kjørende prosessene på systemet ditt vises.

Du kan bruke grep til å søke etter en bestemt kjørende prosess som følger:

ps -ef | grep firefox. 

Sammendrag

grep-kommandoen er en grunnleggende Linux kommando, og det er en som er vel verdt å lære, da den vil gjøre livet ditt mye enklere når du søker etter filer og prosesser når du bruker terminalen.