grep

Bruker grep (og egrep) med Regular Expressions

Bruker grep (og egrep) med Regular Expressions
Denne opplæringen beskriver hvordan du bruker begge deler grep (og egrep) to finne tekst i filer, i sin enkle form og kombinert med regulære uttrykk. Den inneholder flere eksempler og øvelser, i tillegg til løsninger, for seeren å fullføre.

Navnet grep kommer fra ed (og vim) -kommandoen “g / re / p”, som betyr globalt å søke etter et gitt regulært uttrykk og skrive ut (vise) utgangen.

Regelmessig Uttrykkene

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

Eksempel på fil

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

Bruk en redaktør som nano eller vim til å kopiere teksten nedenfor til 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 dobbelt anførselstegn kanskje ikke kopieres ordentlig), må kommandoer skrives inn for å lære dem riktig.

Før du prøver eksemplene, kan du se på eksempelfilen:

$ cat myfile

Enkelt søk

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

$ grep xyz myfile

Bruke farger

For å vise farger bruker du -color (en dobbel bindestrek) eller bare lager et alias. For eksempel:

$ grep --color xyz myfile

eller

$ alias grep = 'grep --farge'
$ grep xyz myfile

Alternativer

Vanlige alternativer brukt med grep kommandoen inkluderer:

For eksempel:

$ grep -i xyz myfile # finn tekst uavhengig av sak
$ grep -ic xyz myfile # telle linjer med tekst
$ grep -in xyz myfile # vis linjenumre

Lag flere filer

Før du prøver å søke i flere filer, må du først opprette flere nye filer:

$ echo xyz> myfile1
$ echo -e “xyz \ nxzz \ nXYZ”> myfile2
$ echo -e “xxx \ nyyy”> myfile3
$ cat myfile1
$ cat myfile2
$ cat myfile3

Søk i flere filer

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

$ grep -ic xyz myfile myfile1 myfile2 myfile3
$ grep -in xyz my * 
# filnavn som begynner med 'min'

Ø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 IKKE inneholder teksten var.
  4. Finn oppføringen for påloggingen din i / etc / passwd

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

Bruke vanlige uttrykk

Kommandoen grep kan også brukes med vanlige uttrykk ved å bruke ett eller flere av elleve spesialtegn eller symboler for å avgrense søket. Et vanlig uttrykk er en tegnstreng som inkluderer spesialtegn for å tillate mønstermatching i verktøy som f.eks grep, vim og sed. Merk at strengene kan trenge å være vedlagt i anførselstegn.

Spesialtegnene som er tilgjengelige inkluderer:

^ Start på en linje
$ Slutten på en linje
. Alle tegn (unntatt \ n ny linje)
* 0 eller flere av forrige uttrykk
\ Å gå foran 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 de følgende eksemplene.

Eksempler

For å finne alle linjene som begynner med tekst ved hjelp av tegnet ^:

$ grep '^ xyz' myfile

Slik finner du alle linjene som slutter med tekst med $ -tegnet:

$ grep 'xyz $' myfile

Slik finner du linjer som inneholder en streng som bruker både ^ og $ tegn:

$ grep '^ xyz $' myfile

For å finne linjer ved hjelp av . for å matche hvilket som helst tegn:

$ grep '^ x.z 'myfile

Slik finner du linjer som bruker * for å matche 0 eller flere av forrige uttrykk:

$ grep '^ xy * z' myfile

For å finne linjer ved hjelp av .* for å matche 0 eller flere av hvilket som helst tegn:

$ grep '^ x.* z 'myfile

For å finne linjer ved hjelp av \ for å unnslippe * karakteren:

$ grep '^ x \ * z' myfile

For å finne \ tegn bruk:

$ grep '\\' myfile

Uttrykk grep - egrep

De grep kommandoen støtter bare en delmengde av de tilgjengelige regulære uttrykkene. Imidlertid kommandoen egrep:

Merk at uttrykkene må være lukket i et par anførselstegn.

For å bruke farger, bruk -color eller opprett et alias igjen:

$ alias egrep = 'egrep --color'

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

| Alternativ, 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 fungerer, selv om ingen melding vises siden 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

Bruke filtre

Piping er prosessen med å sende utdataene fra en kommando som inndata i 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 som sendes til dem før de sender den modifiserte strømmen til standardutgang.

I det følgende eksemplet, standard utgang fra ls -l sendes som standard inngang til grep kommando. Produksjon fra grep kommandoen sendes deretter som inngang til mer kommando.

Dette viser bare 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

Eksempel på fil

For å prøve gjennomgangsøvelsen, må du først opprette følgende eksempelfil.

Bruk en redaktør som nano eller vim til å kopiere teksten nedenfor til en fil som heter mennesker:

Personlig J.Smith 25000
Personlig E.Smith 25400
Trening A.Brun 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
Første etasje T.Smythe 30500
Personlig J.Maler 33000

Øvelse II

  1. Vis filen mennesker og undersøke innholdet.
  2. Finn alle linjene som inneholder strengen Smith i filen folk.Tips: bruk kommandoen grep, men husk at det som standard er mellom store og små bokstaver.
  3. Opprett en ny fil, npeople, som inneholder alle linjene som begynner med strengen Personlig i folkeregisteret.Tips: bruk kommandoen grep med>.
  4. Bekreft innholdet i filen ved å liste opp filen.
  5. Legg nå til alle linjene der teksten slutter med strengen 500 i filen folk til filen npeople.Tips: bruk kommandoen grep med >>.
  6. Igjen, bekreft innholdet i filen npeople ved å føre opp 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.

Flere vanlige uttrykk

Et vanlig uttrykk kan betraktes som jokertegn på steroider.

Det er elleve tegn med spesielle betydninger: åpnings- og lukkende hakeparenteser [], tilbakeslag \, skjermkortet ^, dollartegnet $, perioden eller punktum ., det vertikale stang- eller rørsymbolet |, spørsmålstegnet ?, stjernen eller stjernen *, plusstegnet + og åpnings- og lukkingsrundbraketten . Disse spesialtegnene kalles også ofte metategn.

Her er hele settet med spesialtegn:

^ Start på en linje
$ Slutten på en linje
. Alle tegn (unntatt \ n ny linje)
* 0 eller flere av forrige uttrykk
| Alternativ, enten det ene eller det andre
[…] Eksplisitt sett med tegn å matche
+ 1 eller flere av forrige uttrykk
? 0 eller 1 av forrige uttrykk
\ Å gå foran 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 for eller grep -E.

For å finne linjer ved hjelp av | for å matche begge uttrykkene:

$ egrep 'xxz | xzz' myfile

For å finne linjer med | for å matche begge uttrykkene i en streng, bruk også ():

$ egrep '^ x (Yz | yz)' myfil

Slik finner du linjer som bruker [] for å matche hvilket som helst tegn:

$ egrep '^ x [Yy] z' myfile

Slik finner du linjer som bruker [] for IKKE å matche noe tegn:

$ egrep '^ x [^ Yy] z' myfile

Slik finner du linjer som bruker * for å matche 0 eller flere av forrige uttrykk:

$ egrep '^ xy * z' myfile

Slik finner du linjer som bruker + for å matche 1 eller flere av forrige uttrykk:

$ egrep '^ xy + z' myfile

For å finne linjer ved hjelp av ? for å matche 0 eller 1 i forrige uttrykk:

$ egrep '^ xy?z 'myfile

Øvelse III

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

Flere eksempler

For å finne linjer ved hjelp av . og * for å matche ethvert sett med tegn:

$ egrep '^ xy.* z 'myfile

Slik finner du linjer med for å matche N antall tegn:

$ egrep '^ xy 3 z' myfile
$ egrep '^ xy 4 z' myfile

Slik finner du linjer med for å matche N eller flere ganger:

$ egrep '^ xy 3, z' myfile

Slik finner du 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 enkel form å finne tekst i en fil eller i flere filer. Vi kombinerte deretter teksten det skulle søkes etter med enkle regulære uttrykk og deretter mer komplekse med egrep.

Neste skritt

Jeg håper du vil bruke den kunnskapen du har fått her, til god bruk. Prøve grep kommandoer på dine egne data og husk, regulære uttrykk som beskrevet her kan brukes i samme form i vi, sed og kjipt!

Treningsløsninger

Øvelse I

Først teller du 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 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.
$ kattfolk
Finn alle linjene som inneholder strengen Smith i filen mennesker.
$ grep 'Smith' folk
Opprett en ny fil, mennesker, inneholder alle linjene som begynner med strengen Personlig i mennesker fil
$ grep '^ Personlige' mennesker> mennesker
Bekreft innholdet i filen mennesker ved å føre opp filen.
$ katt npeople
Legg nå til alle linjene der teksten slutter med strengen 500 i filen mennesker til filen mennesker.
$ grep '500 $' mennesker >> mennesker
Bekreft igjen innholdet i filen mennesker ved å føre opp filen.
$ katt npeople
Finn IP-adressen til serveren som er lagret i filen / etc / verter.
$ grep $ (vertsnavn) / etc / hosts
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 linjene som inneholder navnene Evans eller Maler i filen mennesker.
$ egrep 'Evans | Maler' folk
Finn alle linjene som inneholder navnene Smith, Smyth eller Smythe i filen mennesker.
$ egrep 'Sm (i | y) den?folk
Finn alle linjene som inneholder navnene brun, Browen eller Bron i filen folk.
$ egrep 'Brow?e?n 'folk
Finn linjen som inneholder strengen (admin), inkludert parenteser i filen mennesker.

$ egrep '\ (Admin \)' personer

Finn linjen som inneholder tegnet * i filen folk.
$ egrep '\ *' folk
Kombiner 5 og 6 ovenfor for å finne begge uttrykkene.

$ egrep '\ (Admin \) | \ *' personer


SuperTuxKart for Linux
SuperTuxKart er en flott tittel designet for å gi deg Mario Kart-opplevelsen gratis på Linux-systemet ditt. Det er ganske utfordrende og morsomt å spi...
Kjemp om Wesnoth-opplæringen
Kampen om Wesnoth er et av de mest populære open source-strategispillene du kan spille på dette tidspunktet. Ikke bare har dette spillet vært i utvikl...
0 A.D. Opplæringen
Ut av de mange strategispillene der ute, 0 A.D. klarer å skille seg ut som en omfattende tittel og et veldig dypt, taktisk spill til tross for å være ...