Bruke grep (og egrep) med vanlige uttrykk

Using Grep With Regular Expressions



Denne opplæringen beskriver hvordan du bruker begge grep (og egrep) t o finne tekst i filer, i sin enkle form og når den kombineres med vanlige uttrykk. Den inneholder flere eksempler og øvelser , mer løsninger , for seeren å fullføre.

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







Regelmessig Uttrykkene

Verktøyene lar brukeren søke etter 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.



Eksempelfil

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 et redigeringsprogram som nano eller vim for å kopiere teksten nedenfor til en fil som heter min fil .





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 (vær oppmerksom på at doble anførselstegn kanskje ikke kopierer ordentlig), må kommandoer skrives inn for å lære dem riktig.

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



$kattmin fil

Enkelt søk

For å finne teksten 'xyz' i filen, kjør følgende:

$grepxyz minfil

Bruke farger

For å vise farger, bruk –color (et dobbelt bindestrek) eller opprett et alias. For eksempel:

$grep --fargexyz minfil

eller

$alias grep= ’grep--farge'
$grepxyz minfil

Alternativer

Vanlige alternativer som brukes med grep kommandoen inkluderer:

  • -jeg finner alle linjene uansett av saken
  • -c telle hvor mange linjer inneholder teksten
  • -n displaylinje tall av matchende linjer
  • -l display bare fil navn den kampen
  • -r tilbakevendende søk i underkataloger
  • -v finne alle linjer IKKE som inneholder teksten

For eksempel:

$grep -Jegxyz minfil# finn tekst uansett sak

$grep -icxyz minfil# telle linjer med tekst

$grep -ixyz minfil# vis linjenumre

Lag flere filer

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

$kastet utxyz>myfile1
$kastet ut -Ogxyz nxzz nXYZ>myfile2
$kastet ut -Ogxxx nyåå>myfile3
$kattmyfile1
$kattmyfile2
$kattmyfile3

Søk i flere filer

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

$grep -icxyz myfile myfile1 myfile2 myfile3
$grep -ixyz min*
# match filnavn som begynner med 'mitt'

Trening I

  1. Teller først hvor mange linjer det er i filen /etc /passwd.
Tips: bruktoalett -de /etc/passwd
  1. Finn nå alle forekomster av teksten hvor i filen /etc /passwd .
  2. Finn ut hvor mange linjer i filen som inneholder teksten
  3. Finn ut hvor mange linjer IKKE inneholder teksten hvor .
  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 inneholder spesialtegn for å tillate mønstermatching innenfor verktøy som f.eks grep , jeg kom og sed . Vær oppmerksom på at strengene må være vedlagt i anførselstegn.

Spesialtegnene som er tilgjengelige inkluderer:

^ Start på en linje
$ Slutt på en linje
. Ethvert tegn (unntatt n ny linje)
* 0 eller flere av tidligere uttrykk
Foran et symbol gjør det til en bokstavelig karakter

Vær oppmerksom på 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 bruk av sitater i de følgende eksemplene.

Eksempler

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

$grep'^Xyz' min fil

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

$grep'Xyz $' myfile

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

$grep'^Xyz $' myfile

For å finne linjer ved hjelp av . for å matche hvilken som helst karakter:

$grep'^X.z' min fil

Slik finner du linjer ved hjelp av * for å matche 0 eller mer av det forrige uttrykket:

$grep'^Xy*z 'min fil

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

$grep'^ X.*z 'min fil

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

$grep'^ X *z 'min fil

For å finne tegnet, bruk:

$grep'\' min fil

Uttrykk grep - egrep

De grep kommandoen støtter bare et delsett av de vanlige uttrykkene som er tilgjengelige. Men kommandoen egrep:

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

Vær oppmerksom på at uttrykkene må være omsluttet av et par anførselstegn.

For å bruke farger, bruk –color eller lag et nytt alias:

$alias egrep='egrep -farge'

For å søke etter mer enn én regex de egrep kommandoen kan skrives over flere linjer. Dette kan imidlertid også gjøres ved å bruke 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 root, uucp eller mail fra filen,. symbol som betyr et av alternativene.

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

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

På de fleste Linux -systemer er imidlertid kommandoen grep -E er det samme som å bruke egrep :

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

Bruke filtre

Rørføring er prosessen med å sende utgangen av en kommando som input 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 siver gjennom eller endrer inngangen som sendes til dem før de sender den modifiserte strømmen til standardutgang.

I følgende eksempel standardutgang fra ls -l sendes som standardinngang til grep kommando. Utgang fra grep kommandoen blir deretter sendt som input til mer kommando.

Dette viser bare kataloger i /etc :

$ls -de /etc|grep‘^D’|mer

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

$ps -ef|grepcron

$WHO|grepkdm

Eksempelfil

For å prøve gjennomgåelsesøvelsen må du først lage følgende eksempelfil.

Bruk et redigeringsprogram som nano eller vim for å kopiere teksten nedenfor til 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
opplæring* C.Evans 25500
Goodsout W.Pope 30400
Første etasje T.Smythe 30500
Stab J.Maler 33000

Oppgave II

  1. Vis filen mennesker og undersøke innholdet.
  2. Finn alle linjene som inneholder strengen Smith i filen people.Hint: bruk kommandoen grep, men husk at det som standard er store og små bokstaver.
  3. Lag en ny fil, npeople, som inneholder alle linjene som begynner med strengen Personlig i folkefilen.Hint: bruk kommandoen grep med>.
  4. Bekreft innholdet i filen npeople 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. Bekreft igjen innholdet i filen npeople ved å liste opp filen.
  7. Finn IP -adressen til serveren som er lagret i filen /etc/hosts .Hint: 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: åpning og lukking av firkantede parenteser [], skråstrek , tegnet ^, dollartegnet $, punktum eller prikk., Det vertikale linjen eller rørsymbolet |, spørsmålstegnet?, stjerne eller stjerne *, pluss + og åpnings- og lukkende rundebrakett {}. Disse spesialtegnene kalles også ofte metategn.

Her er hele settet med spesialtegn:

^ Start på en linje
$ Slutt på en linje
. Ethvert tegn (unntatt n ny linje)
* 0 eller flere av tidligere uttrykk
| Alternativ, enten det ene eller det andre
[…] Eksplisitt sett med tegn som skal matche
+ 1 eller flere av tidligere uttrykk
? 0 eller 1 av forrige uttrykk
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 regulært uttrykk. For at alle de følgende eksemplene skal fungere, bruk egrep i stedet eller grep -E .

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

$egrep'Xxz|xzz 'min fil

For å finne linjer ved hjelp av | Bruk () for å matche begge uttrykkene i en streng:

$egrep'^ X(Yz|yz)'Min fil

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

$egrep'^ X[Ååå]z 'min fil

Slik finner du linjer med [] for IKKE å matche noen tegn:

$egrep'^ X[^ Åå]z 'min fil

Slik finner du linjer ved hjelp av * for å matche 0 eller mer av det forrige uttrykket:

$egrep'^Xy*z 'min fil

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

$egrep‘^Xy+z’ myfile

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

$egrep‘^Xy? Z’ myfile

Oppgave 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 Kilde i filen people.If du har tid:
  4. Finn linjen som inneholder strengen (admin), inkludert parentesene, i filfolket.
  5. Finn linjen som inneholder tegnet * i filfolket.
  6. Kombiner 5 og 6 ovenfor for å finne begge uttrykkene.

Flere eksempler

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

$egrep'^Xy.*z 'min fil

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

$egrep'^Xy{3}z 'min fil
$egrep'^Xy{4}z 'min fil

Slik finner du linjer som bruker {} for å matche N eller flere ganger:

$egrep'^Xy{3,}z 'min fil

Slik finner du linjer som bruker {} for å matche N ganger, men ikke mer enn M ganger:

$egrep'^Xy{2,3}z 'min fil

Konklusjon

I denne opplæringen så vi først på bruk grep i sin enkle form for å finne tekst i en fil eller i flere filer. Deretter kombinerte vi teksten som skulle søkes etter med enkle regulære uttrykk og deretter mer komplekse uttrykk ved hjelp av egrep .

Neste skritt

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

Treningsløsninger

Trening I

Teller først hvor mange linjer det er i filen /etc/passwd .
$ wc -l /etc/passwd
Finn nå alle forekomster av teksten hvor i filen /etc /passwd.
$ grep var /etc/passwd
Finn ut hvor mange linjer i filen som inneholder teksten hvor

grep -chvor/etc/passwd

Finn ut hvor mange linjer IKKE inneholder teksten hvor .

grep -CVhvor/etc/passwd

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

Oppgave II

Vis filen mennesker og undersøke innholdet.
$ cat people
Finn alle linjene som inneholder strengen Smith i filen mennesker .
$ grep 'Smith' people
Lag en ny fil, mennesker , som inneholder alle linjene som begynner med strengen Personlig i mennesker fil
$ grep '^Personal' people> npeople
Bekreft innholdet i filen mennesker ved å liste opp filen.
$ cat npeople
Legg nå til alle linjene der teksten slutter med strengen 500 i filen mennesker til filen mennesker .
$ grep '500$' people>>npeople
Bekreft igjen innholdet i filen mennesker ved å liste opp filen.
$ cat npeople
Finn IP -adressen til serveren som er lagret i filen /etc/hosts .
$ grep $(hostname) /etc/hosts
Bruk egrep å trekke ut fra /etc/passwd filkontolinjer som inneholder lp eller din egen bruker -ID.
$ egrep '(lp|kdm:)' /etc/passwd

Oppgave III

Finn alle linjene som inneholder navnene Evans eller maler i filen mennesker .
$ egrep 'Evans|Maler' people
Finn alle linjene som inneholder navnene Smith , Smyth eller Smythe i filen mennesker .
$ egrep 'Sm(i|y)the?' people
Finn alle linjene som inneholder navnene brun , Browen eller Kilde i filen folk.
$ egrep 'Brow?e?n' people
Finn linjen som inneholder strengen (admin), inkludert parentesene, i filen mennesker .

$egrep ' (Admin )'mennesker

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

$egrep ' (Admin ) | *'mennesker