Hvordan bruke dem effektivt?

Hvis du har brukt Linux en stund, vet du allerede om grep — Global Regular Expression Print, et tekstbehandlingsverktøy som du kan bruke til å søke i filer og kataloger. Det er veldig nyttig i hendene på en Linux-kraftbruker. Men å bruke den uten regulært uttrykk kan begrense mulighetene.

Men hva er Regex?

Regex er regulære uttrykk som du kan bruke til å forbedre grep-søkefunksjonaliteten. Regex, per definisjon, er et avansert utgangsfiltreringsmønster. Med praksis kan du bruke regex effektivt, siden du også kan bruke det med andre Linux-kommandoer.

I opplæringen vår lærer vi hvordan du bruker Grep og Regex effektivt.

Forutsetning

Å bruke grep med regex krever god Linux-kunnskap. Hvis du er nybegynner, så sjekk ut våre Linux-guider.

Du trenger også tilgang til en bærbar PC eller datamaskin som kjører Linux-operativsystemet. Du kan bruke hvilken som helst Linux-distro du ønsker. Og hvis du har en Windows-maskin, kan du fortsatt bruke Linux med WSL2. Sjekk ut vår detaljerte oppfatning av det her.

Tilgang til kommandolinjen/terminalen lar deg kjøre alle kommandoene gitt i vår grep/regex-opplæring.

Videre trenger du også tilgang til en tekstfil(er) som du trenger for å kjøre eksemplene. Jeg brukte ChatGPT til å generere en tekstvegg, og ba den skrive om teknologi. Spørringen jeg brukte er som nedenfor.

«Generer 400 ord om teknologi. Det bør inkludere det meste av teknologi. Pass også på at du gjentar teknologinavn i teksten.»

Når den genererte teksten, kopierte jeg den og lagret den i tech.txt-filen, som vi vil bruke gjennom veiledningen.

Til slutt er en grunnleggende forståelse av grep-kommandoen et must. Du kan sjekke ut 16 eksempler på grep-kommandoer for å oppdatere kunnskapen din. Vi introduserer også grep-kommandoen kort for å komme i gang.

Syntaks og eksempler på grep-kommando

Syntaksen for grep-kommandoen er enkel.

$ grep -options [regex/pattern] [files]

Som du kan legge merke til, forventer den et mønster og listen over filer du vil kjøre kommandoen.

Det er mange tilgjengelige grep-alternativer som endrer funksjonaliteten. Disse inkluderer:

  • – i: ignorere tilfeller
  • -r: gjør rekursivt søk
  • -w: utfør et søk for kun å finne hele ord
  • -v: viser alle linjene som ikke samsvarer
  • -n: Vis alle samsvarende linjenumre
  • -l: skriv ut filnavnene
  • –farge: farget resultatutgang
  • -c: viser antall kamper for mønsteret som brukes
  Rett opp "ifconfig-kommando ikke funnet"-feil i minutter

#1. Søk etter et helt ord

Du må bruke -w-argumentet med grep for et helt ordsøk. Ved å bruke den omgår du alle strenger som samsvarer med det gitte mønsteret.

$ grep -w ‘tech\|5G’ tech.txt

Som du kan se, resulterer kommandoen i en utgang der den søker etter to ord, «5G» og «tech», gjennom hele teksten. Den merker dem deretter med rød farge.

Her er | pipesymbolet escapes slik at grep ikke behandler det som et metategn.

For å gjøre et søk som ikke skiller mellom store og små bokstaver, bruk grep med -i-argumentet.

$ grep -i ‘tech’ tech.txt

Kommandoen søker etter alle små og store forekomster av «tech»-strengen, enten det er et helt ord eller en del av det.

For å vise alle linjene som ikke inneholder et gitt mønster, må du bruke -v-argumentet.

$ grep -v ‘tech’ tech.txt

Utdataene viser alle linjene som ikke inneholder ordet «tech.» Du vil også se tomme linjer. Disse linjene er linjene som er etter et avsnitt.

For å gjøre et rekursivt søk, bruk -r-argumentet med grep.

$ grep -R ‘error\|warning’ /var/log/*.log
#output

/var/log/bootstrap.log:2023-01-03 21:40:18 URL:http://ftpmaster.internal/ubuntu/pool/main/libg/libgpg-error/libgpg-erro 0_1.43-3_amd64.deb [69684/69684] -> "/build/chroot//var/cache/apt/archives/partial/libgpg-error0_1.43-3_amd64.deb" [1]

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: ignoring pre-dependency problem!

grep-kommandoen søker rekursivt etter to ord, «feil» og «advarsel,» i /var/log-katalogen. Dette er en praktisk kommando for å lære om eventuelle advarsler og feil i loggfilene.

Grep og Regex: Hva det er og eksempler

Når vi jobber med regex, må du vite at regex tilbyr tre syntaksalternativer. Disse inkluderer:

  • Grunnleggende regulære uttrykk (BRE)
  • Utvidede regulære uttrykk (ERE)
  • Pearl-kompatible regulære uttrykk (PCRE)

grep-kommandoen bruker BRE som standardalternativ. Så hvis du vil bruke andre regex-moduser, må du nevne dem. grep-kommandoen behandler også metategn som de er. Så hvis du bruker metategn som ?, +, ), må du unnslippe dem med omvendt skråstrek (\)-kommandoen.

Syntaksen til grep med regex er som nedenfor.

$ grep [regex] [filenames]

La oss se grep og regex i aksjon med eksemplene nedenfor.

#1. Bokstavelige ord samsvarer

For å gjøre en bokstavelig ordmatch, må du oppgi en streng som regulært uttrykk. Tross alt er et ord også et regulært uttrykk.

$ grep "technologies" tech.txt

På samme måte kan du også bruke bokstavelige treff for å finne nåværende brukere. For å gjøre det, løp,

$ grep bash /etc/passwd
#output

root:x:0:0:root:/root:/bin/bash

nitt:x:1000:1000:,,,:/home/nitt:/bin/bash

Dette viser brukerne som har tilgang til bashen.

  Hvordan finne og bruke kobber i Minecraft

#2. Ankermatching

Ankermatching er en nyttig teknikk for avanserte søk med spesialtegn. I regulært uttrykk er det forskjellige ankertegn som du kan bruke til å representere bestemte posisjoner i en tekst. Disse inkluderer:

  • «^»-kart-symbol: Cart-symbolet samsvarer med starten på inndatastrengen eller linjen og ser etter en tom streng.
  • «$» dollarsymbol: Dollarsymbolet samsvarer med slutten av inndatastrengen eller linjen og ser etter en tom streng.

De to andre ankermatchende tegnene inkluderer «\ b»-ordgrensen og «\ B» ikke-ordgrense.

  • «\ b» ordgrense: Med \b kan du hevde posisjonen mellom et ord og et ikke-ordtegn. Med enkle ord lar den deg matche hele ord. På denne måten kan du unngå delvise kamper. Du kan også bruke den til å erstatte ord eller telle ordforekomster i en streng.
  • \B ikke-ordgrense: Det er det motsatte av \b ordgrense i regulært uttrykk da det hevder en posisjon som ikke er mellom to-ord eller ikke-ord tegn.

La oss gå gjennom eksempler for å få en klar idé.

$ grep ‘^From’ tech.txt

Bruk av caret krever at ordet eller mønsteret skrives inn med riktig bokstav. Det er fordi det skiller mellom store og små bokstaver. Så hvis du kjører følgende kommando, vil den ikke returnere noe.

$ grep ‘^from’ tech.txt

På samme måte kan du bruke $-symbolet for å finne setningen som samsvarer med et gitt mønster, streng eller ord.

$ grep ‘technology.$' tech.txt

Du kan kombinere både ^- og $-symboler også. La oss se på eksemplet nedenfor.

$ grep “^From \| technology.$” tech.txt

Som du kan se, inneholder utgangen setninger som begynner med «Fra» og setninger som slutter med «teknologi.»

#3. Gruppering

Hvis du ønsker å søke i flere mønstre samtidig, må du bruke gruppering. Det hjelper deg med å lage små grupper av karakterer og mønstre som du kan behandle som en enkelt enhet. Du kan for eksempel opprette en gruppe (tech) som inkluderer termen «t», «e»,» c»,» h.»

For å få en klar idé, la oss ta en titt på et eksempel.

$ grep 'technol\(ogy\)\?' tech.txt

Med gruppering kan du matche gjentatte mønstre, fange grupper og søke etter alternativer.

Alternativt søk med gruppering

La oss se et eksempel på et alternativt søk.

$ grep "\(tech\|technology\)" tech.txt

Hvis du vil utføre et søk på en streng, må du sende den med pipesymbolet. La oss se det i eksemplet nedenfor.

$ echo “tech technological technologies technical” |  grep "\(tech\|technology\)"
#output

“tech technological technologies technical”

Fange grupper, ikke-fangende grupper og gjentatte mønstre

Og hva med å fange og ikke-fange grupper?

  Tre måter å forbedre smarthjemmet ditt på

Du må opprette en gruppe i regex og sende den til strengen eller en fil for å fange grupper.

$ echo 'tech655 tech655nical technologies655 tech655-oriented 655' | grep "\(tech\)\(655\)"
#output

tech655 tech655nical technologies655 tech655-oriented 655

Og for grupper som ikke fanges opp, må du bruke ?: innenfor parentes.

Til slutt har vi gjentatte mønstre. Du må endre regex for å se etter gjentatte mønstre.

$ echo ‘teach tech ttrial tttechno attest’ | grep '\(t\+\)'
#output

‘teach tech ttrial tttechno attest’

Her ser det regulære uttrykket etter en eller flere forekomster av «t»-tegnet.

#4. Karakterklasser

Med karakterklasser kan du enkelt skrive regex-uttrykk. Disse tegnklassene bruker firkantede parenteser. Noen av de kjente karakterklassene inkluderer:

  • [:digit:] – 0 til 9 sifre
  • [:alpha:] – alfabetiske tegn
  • [:alnum:] – alfanumeriske tegn
  • [:lower:] – små bokstaver
  • [:upper:] – store bokstaver
  • [:xdigit:] – heksadesimale sifre, inkludert 0-9, AF, af
  • [:blank:] – tomme tegn som tabulator eller mellomrom

Og så videre!

La oss sjekke noen av dem i aksjon.

$ grep [[:digit]] tech.txt

$ grep [[:alpha:]] tech.txt

$ grep [[:xdigit:]] tech.txt

#5. Kvantifiserere

Kvantifiserere er metategn og er kjernen i regex. Disse lar deg matche eksakt utseende. La oss se på dem nedenfor.

  • * → Null eller flere treff
  • + → en eller flere treff
  • ? → Null eller ett treff
  • {x} → x samsvarer
  • {x, } → x eller flere treff
  • {x,z} → fra x til z samsvarer
  • {, z} → opptil z treff
$ echo ‘teach tech ttrial tttechno attest’ | grep -E 't+'
#output

‘teach tech ttrial tttechno attest’

Her søker den etter «t»-tegnforekomstene for ett eller flere treff. Her står -E for utvidet regex (som vi skal diskutere senere.)

#6. Utvidet regulært uttrykk

Hvis du ikke liker å legge til escape-tegn i regex-mønsteret, må du bruke utvidet regex. Det fjerner behovet for å legge til escape-tegn. For å gjøre det, må du bruke -E-flagget.

$ grep -E 'in+ovation' tech.txt

#7. Bruke PCRE til å gjøre komplekse søk

PCRE (Perl Compatible Regular Expression) lar deg gjøre mye mer enn å skrive grunnleggende uttrykk. For eksempel kan du skrive «\d» som angir [0-9].

Du kan for eksempel bruke PCRE til å søke etter e-postadresser.

echo "Contact me at [email protected]" | grep -P "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b"
#output

Contact me at [email protected]

Her sørger PCRE for at mønsteret er matchet. På samme måte kan du også bruke et PCRE-mønster for å se etter datomønstre.

$ echo "The Sparkain site launched on 2023-07-29" | grep -P "\b\d{4}-\d{2}-\d{2}\b"
#output

The Sparkain site launched on 2023-07-29

Kommandoen finner datoen i formatet ÅÅÅÅ-MM-DD. Du kan endre den for å matche andre datoformater også.

#8. Veksling

Hvis du vil ha alternative treff, kan du bruke de escaped pipe-tegnene (\|).

$ grep -L ‘warning\|error’ /var/log/*.log
#output

/var/log/alternatives.log

/var/log/bootstrap.log

/var/log/dpkg.log

/var/log/fontconfig.log

/var/log/ubuntu-advantage.log

/var/log/upgrade-policy-changed.log

Utdataene viser filnavnene som inneholder «advarsel» eller «feil».

Siste ord

Dette fører oss til slutten av vår grep- og regex-guide. Du kan bruke grep med regulært uttrykk mye for å avgrense søk. Med riktig bruk kan du spare mye tid og hjelpe til med å automatisere mange oppgaver, spesielt hvis du bruker dem til å skrive skript eller bruke regulært uttrykk til å søke gjennom teksten.

Deretter kan du sjekke ut ofte stilte Linux-intervjuspørsmål og svar.