Bruker grep med vanlige uttrykk

Bruker grep med vanlige uttrykk
Denne opplæringen beskriver hvordan du bruker begge deler grep (og Egrep) to Finn tekst i filer, i deres enkle form og når det kombineres med vanlige uttrykk. Den inneholder flere eksempler og øvelser, Plus løsninger, for at betrakteren skal fullføre.

Navnet grep Kommer fra ED (og VIM) -kommandoen “G/Re/P”, som betyr globalt søk etter et gitt vanlig uttrykk og trykk (vis) Utgangen.

Regelmessig Uttrykkene

Verktøyene lar brukeren søke tekstfiler for linjer som samsvarer med et vanlig uttrykk (regexp). Et vanlig uttrykk er en søkestreng som består av tekst og en eller flere av 11 spesialtegn. Et enkelt eksempel samsvarer med starten på en linje.

Eksempelfil

Den grunnleggende formen for grep kan brukes til å finne enkel tekst i en bestemt fil eller filer. For å prøve eksemplene, opprett først prøvefilen.

Bruk en redaktør som Nano eller Vim for å kopiere teksten nedenfor i en fil som heter myfile.

xyz
xyzde
Exyzd
Dexyz
d?gxyz
xxz
xzz
x \ z
x*z
xz
x z
Xyz
Xyyz
xyz
xyyz
xyyyz
XYYYYZ

Selv om du kan kopiere og lime inn eksemplene i teksten (merk at doble sitater kanskje ikke kopierer riktig), må kommandoer skrives for å lære dem ordentlig.

Før du prøver eksemplene, kan du se prøvefilen:

katt myfil
xyz
xyzde
Exyzd
Dexyz
d?gxyz
xxz
xzz
x \ z
x*z
xz
x z
Xyz
Xyyz
xyz
xyyz
xyyyz
XYYYYZ

Enkelt søk

For å finne teksten 'XYZ' i filen kjører følgende:

grep xyz myfile
xyz
xyzde
Exyzd
Dexyz
d?gxyz

Alternativer

Vanlige alternativer brukt med grep Kommando inkluderer:

  • -Jeg finner alle linjer uavhengig av sak
  • -c telle Hvor mange linjer inneholder teksten
  • -n Skjermlinje tall av matchende linjer
  • -l Display fil navn den kampen
  • -r tilbakevendende Søk etter underkataloger
  • -v Finn alle linjer IKKE inneholder teksten

For eksempel:

grep -i xyz myfile
# Finn tekst uavhengig av sak
xyz
xyzde
Exyzd
Dexyz
d?gxyz
Xyz
xyz
grep -ic xyz myfile
# telle linjer med tekst
7
grep -in xyz myfile
# Vis linjenummer
1: XYZ
2: Xyzde
3: Exyzd
4: Dexyz
5: d?gxyz
12: XYZ
14: XYZ

Lag flere filer

Før du prøver å søke på flere filer, oppretter du først flere nye filer:

ekko xyz> myfile1
Cat MyFile1
xyz
ekko -e 'xyz \ nxzz \ nxyz'> myfile2
Cat MyFile2
xyz
xzz
Xyz
ekko -e 'xxx \ nyyy'> myfile3
Cat MyFile3
xxx
Åååå

Søk i flere filer

For å søke i flere filer ved hjelp av filnavn eller et jokertegn Enter:

grep -ic xyz myfile myfile1 myfile2 myfile3
MyFile: 7
MyFile1: 1
MyFile2: 2
myfile3: 0
# match filnavn som begynner med 'min'
grep -in xyz min*
MyFile: 1: XYZ
MyFile: 2: Xyzde
MyFile: 3: Exyzd
MyFile: 4: Dexyz
Myfile: 5: D?gxyz
MyFile: 12: XYZ
MyFile: 14: XYZ
myfile1: 1: xyz
myfile2: 1: xyz
myfile2: 3: xyz

Øvelse i

  1. Først teller hvor mange linjer det er i filen /etc /passwd.
Tips: Bruk WC -L /etc /passwd
  1. Finn nå alle forekomster av teksten var I filen /etc /passwd.
  2. Finn hvor mange linjer i filen som inneholder teksten
  3. Finn hvor mange linjer som ikke inneholder teksten var.
  4. Finn oppføringen for påloggingen din i /etc/passwd

Treningsløsninger finner du på slutten av denne artikkelen.

Ved hjelp av vanlige uttrykk

Kommandoen grep Kan også brukes med vanlige uttrykk ved å bruke en eller flere av elleve spesialtegn eller symboler for å avgrense søket. Et vanlig uttrykk er en karakterstreng som inkluderer spesialtegn for å tillate mønstermatching i verktøy som grep, vim og sed. Merk at strengene kanskje må være vedlagt i sitater.

De tilgjengelige spesialtegnene inkluderer:

^ Start av en linje
$ Slutten av en linje
. Enhver karakter (unntatt \ n newline)
* 0 eller flere av tidligere uttrykk
\ Forut for et symbol gjør det til en bokstavelig karakter

Merk at *, som kan brukes på kommandolinjen for å matche et hvilket som helst antall tegn inkludert ingen, er ikke brukt på samme måte her.

Legg også merke til bruken av sitater i følgende eksempler.

Eksempler

For å finne alle linjer som starter med tekst ved hjelp av ^ karakteren:

grep '^xyz' myfile

For å finne alle linjer som slutter med tekst ved å bruke $ -tegnet:

grep 'xyz $' myfile

For å finne linjer som inneholder en streng som bruker både ^ og $ tegn:

grep '^xyz $' myfile

Å finne linjer ved å bruke . For å matche enhver karakter:

grep '^x.z 'myfile

For å finne linjer som bruker * for å matche 0 eller flere av det forrige uttrykket:

grep '^xy*z' myfile

Å finne linjer som bruker .* For å matche 0 eller mer av noen karakter:

grep '^x.*z 'myfile

Å finne linjer ved å bruke \ å unnslippe * karakteren:

grep '^x \*z' myfile

For å finne \ karakterbruk:

grep '\\' myfile

Uttrykk grep - egrep

De grep Kommando støtter bare en delmengde av de vanlige uttrykkene som er tilgjengelige. Imidlertid kommandoen Egrep:

  • tillater full bruk av alle vanlige uttrykk
  • kan samtidig søke etter mer enn ett uttrykk

Merk at uttrykkene må være vedlagt i et par sitater.

For å søke etter mer enn en regex de Egrep Kommando kan skrives over flere linjer. Dette kan imidlertid også gjøres ved hjelp av disse spesialtegnene:

| Veksling, enten det ene eller det andre
(...) Logisk gruppering av en del av et uttrykk
Egrep '(^root |^uucp |^mail)' /etc /passwd

Dette trekker ut linjene som begynner med rot, UUCP eller e -post fra filen, | symbol som betyr et av alternativene.

Følgende kommando vil ikke arbeid, selv om det ikke vises noen melding, siden det grunnleggende grep Kommando støtter ikke alle vanlige uttrykk:

grep '(^root |^uucp |^mail)' /etc /passwd

Men på de fleste Linux -systemer kommandoen grep -e er det samme som å bruke Egrep:

grep -e '(^root |^uucp |^mail)' /etc /passwd

Ved hjelp av filtre

Rør er prosessen med å sende utdataene fra en kommando som innspill til en annen kommando og er et av de kraftigste Linux -verktøyene som er tilgjengelige.

Kommandoer som vises i en rørledning blir ofte referert til som filtre, siden de i mange tilfeller siler gjennom eller endrer inngangen til dem før de sender den modifiserte strømmen til standardutgang.

I det følgende eksempelet, standardutgang fra ls -l sendes som standardinngang til grep kommando. Utgang fra grep Kommandoen sendes deretter som innspill til mer kommando.

Dette vil bare vise kataloger i /etc:

ls -l /etc | grep '^d' | mer

Følgende kommandoer er eksempler på bruk av filtre:

ps -ef | grep cron
hvem | grep kdm

Eksempelfil

For å prøve gjennomgangsøvelsen, oppretter du først følgende prøvefil.

Bruk en redaktør som Nano eller Vim for å kopiere teksten nedenfor i en fil som heter mennesker:

PERSONLIG J.Smith 25000
Personlig e.Smith 25400
Trening a.Brown 27500
Trening c.Browen 23400
(Admin) r.Bron 30500
GOODSOUT T.Smyth 30000
Personlig f.Jones 25000
trening* c.Evans 25500
GOODSOUT W.Pave 30400
Groundgulv t.Smythe 30500
PERSONLIG J.Maler 33000

Øvelse II

  1. Vis filen mennesker og undersøke innholdet.
  2. Finn alle linjer som inneholder strengen Smith i filen folk.Tips: Bruk kommandoen grep, men husk at det som standard er tilfelle.
  3. Lag en ny fil, npeople, som inneholder alle linjer som begynner med strengen Personlig i folketilen.Tips: Bruk kommandoen grep med>.
  4. Bekreft innholdet i filen Npeople ved å liste opp filen.
  5. Legg nå alle linjer der teksten ender med strengen 500 I filen til filen til filen.Tips: Bruk kommandoen grep med >>.
  6. Bekreft igjen innholdet i filen.
  7. Finn IP -adressen til serveren som er lagret i filen /etc/verter.Tips: Bruk kommandoen grep med $ (vertsnavn)
  8. Bruk Egrep å trekke ut fra /etc/passwd filkontolinjer som inneholder LP eller din egen bruker-ID.

Treningsløsninger finner du på slutten av denne artikkelen.

Mer vanlige uttrykk

Et vanlig uttrykk kan tenkes som jokertegn på steroider.

Det er elleve tegn med spesielle betydninger: åpnings- og lukking ., den vertikale stangen eller rørsymbolet |, spørsmålstegnet ?, Stjernen eller stjernen *, pluss -tegnet + og åpnings- og lukkende brakett . Disse spesialtegnene kalles også ofte metakaraktører.

Her er hele settet med spesialtegn:

^ Start av en linje
$ Slutten av en linje
. Enhver karakter (unntatt \ n newline)
* 0 eller flere av tidligere uttrykk
| Veksling, enten det ene eller det andre
[…] Eksplisitt sett med karakterer som skal matche
+ 1 eller flere av tidligere uttrykk
? 0 eller 1 i tidligere uttrykk
\ Forut for et symbol gjør det til en bokstavelig karakter
Eksplisitt kvantifiseringsnotasjon
(...) Logisk gruppering av en del av et uttrykk

Standardversjonen av grep har bare begrenset støtte for regelmessig uttrykk. For at alle følgende eksempler skal fungere, bruk Egrep i stedet eller grep -e.

Å finne linjer ved å bruke | For å matche begge uttrykkene:

Egrep 'xxz | xzz' myfile

Å finne linjer som bruker | For å matche begge uttrykkene i en streng, bruker du også ():

Egrep '^x (yz | yz)' myfile

For å finne linjer som bruker [] for å matche enhver karakter:

Egrep '^x [yy] z' myfile

Å finne linjer som bruker [] for ikke å matche noen karakter:

Egrep '^x [^yy] z' myfile

For å finne linjer som bruker * for å matche 0 eller flere av det forrige uttrykket:

egrep '^xy*z' myfile

For å finne linjer som bruker + for å matche 1 eller flere av det forrige uttrykket:

Egrep '^xy+z' myfile

Å finne linjer ved å bruke ? For å matche 0 eller 1 i forrige uttrykk:

Egrep '^xy?z 'myfile

Øvelse III

  1. Finn alle linjer som inneholder navnene Evans eller Maler i filen folk.
  2. Finn alle linjer som inneholder navnene Smith, Smyth eller Smythe i filen folk.
  3. Finn alle linjer som inneholder navnene Brown, Browen eller Bron i filen folk.Hvis du har tid:
  4. Finn linjen som inneholder strengen (admin), inkludert parentesene, i filen People.
  5. Finn linjen som inneholder tegnet * i filen People.
  6. Kombiner 5 og 6 ovenfor for å finne begge uttrykkene.

Flere eksempler

Å finne linjer som bruker . og * for å matche et hvilket som helst sett med karakterer:

Egrep '^xy.*z 'myfile

For å finne linjer som bruker for å matche n antall tegn:

Egrep '^xy 3 z' myfile
Egrep '^xy 4 z' myfile

For å finne linjer som bruker for å matche n eller flere ganger:

Egrep '^xy 3, z' myfile

For å finne linjer som bruker for å matche n ganger, men ikke mer enn M ganger:

Egrep '^xy 2,3 z' myfile

Konklusjon

I denne opplæringen så vi først på å bruke grep i det er enkelt å finne tekst i en fil eller i flere filer. Vi kombinerte deretter teksten som skal søkes etter med enkle vanlige uttrykk og deretter mer komplekse ene ved hjelp av Egrep.

Neste skritt

Jeg håper du vil bruke kunnskapen her til god bruk. Prøve grep Kommandoer på dine egne data og husk at vanlige uttrykk som beskrevet her kan brukes i samme form i vi, sed og awk!

Treningsløsninger

Øvelse i

Teller først hvor mange linjer det er i filen /etc/passwd.

wc -l /etc /passwd

Finn nå alle forekomster av teksten var I filen /etc /passwd.

grep var /etc /passwd

Finn hvor mange linjer i filen som inneholder teksten var

grep -c var /etc /passwd

Finn hvor mange linjer som ikke inneholder teksten var.

grep -cv var /etc /passwd

Finn oppføringen for påloggingen din i /etc/passwd fil

grep kdm /etc /passwd


Øvelse II

Vis filen mennesker og undersøke innholdet.

kattefolk

Finn alle linjer som inneholder strengen Smith i filen mennesker.

grep 'smith' mennesker

Lag en ny fil, npeople, inneholder alle linjer som begynner med strengen Personlig i mennesker fil

grep '^personlige' mennesker> npeople

Bekreft innholdet i filen npeople Ved å oppgi filen.

Cat Npeople

Legg nå alle linjer der teksten ender med strengen 500 i filen mennesker til filen npeople.

grep '500 $' folk >> npeople

Bekreft igjen innholdet i filen npeople Ved å oppgi filen.

Cat Npeople

Finn IP -adressen til serveren som er lagret i filen /etc/verter.

grep $ (vertsnavn) /etc /verter

Bruk Egrep å trekke ut fra /etc/passwd filkontolinjer som inneholder LP eller din egen bruker -ID.

Egrep '(lp | kdm :)' /etc /passwd


Øvelse III

Finn alle linjer som inneholder navnene Evans eller Maler i filen mennesker.

Egrep 'Evans | Maler' mennesker

Finn alle linjer som inneholder navnene Smith, Smyth eller Smythe i filen mennesker.

Egrep 'sm (i | y) The?'Mennesker

Finn alle linjer som inneholder navnene brun, Browen eller Bron i filen folk.

Egrep 'Brow?e?n 'mennesker

Finn linjen som inneholder strengen (admin), inkludert parentesene, i filen mennesker.

$ egrep '\ (admin \)' folk

Finn linjen som inneholder karakteren * i filen folk.

Egrep '\*' mennesker

Kombiner 5 og 6 ovenfor for å finne begge uttrykkene.

Egrep '\ (admin \) | \*' People