grep

Brug af grep (og egrep) med Regular Expressions

Brug af grep (og egrep) med Regular Expressions
Denne vejledning beskriver, hvordan du bruger begge dele grep (og egrep) to finde tekst i filer i deres enkle form og når de kombineres med regulære udtryk. Den indeholder flere eksempler og øvelser, plus løsninger, for seeren at gennemføre.

Navnet grep kommer fra ed (og vim) kommandoen “g / re / p”, hvilket betyder globalt at søge efter et givet regulært udtryk og udskrive (vise) output.

Fast Udtryk

Hjælpeprogrammerne giver brugeren mulighed for at søge i tekstfiler efter linjer, der matcher et regulært udtryk (regexp). Et regulært udtryk er en søgestreng, der består af tekst og et eller flere af 11 specialtegn. Et simpelt eksempel er at matche starten på en linje.

Prøvefil

Den grundlæggende form for grep kan bruges til at finde simpel tekst i en bestemt fil eller filer. For at prøve eksemplerne skal du først oprette prøvefilen.

Brug en editor som nano eller vim til at kopiere nedenstående tekst til en fil, der hedder myfile.

xyz
xyzde
exyzd
dexyz
d?gxyz
xxz
xzz
x \ z
x * z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

Selvom du muligvis kopierer og indsætter eksemplerne i teksten (bemærk, at dobbelt anførselstegn muligvis ikke kopieres korrekt), skal kommandoer indtastes for at lære dem ordentligt.

Før du prøver eksemplerne, skal du se eksemplet på filen:

$ cat myfile

Enkel søgning

For at finde teksten 'xyz' i filen skal du køre følgende:

$ grep xyz myfile

Brug af farver

For at få vist farver skal du bruge -farve (en dobbelt bindestreg) eller blot oprette et alias. For eksempel:

$ grep --color xyz myfile

eller

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

Muligheder

Almindelige muligheder, der bruges med grep kommando inkluderer:

For eksempel:

$ grep -i xyz myfile # find tekst uanset sag
$ grep -ic xyz myfile # tælle linjer med tekst
$ grep -in xyz myfile # viser linjenumre

Opret flere filer

Før du prøver at søge i flere filer, skal du først oprette flere nye filer:

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

Søg i flere filer

For at søge i flere filer ved hjælp af filnavne eller et jokertegn skal du indtaste:

$ grep -ic xyz myfile myfile1 myfile2 myfile3
$ grep -in xyz my * 
# match filnavne, der begynder med 'min'

Øvelse I

  1. Tæl først, hvor mange linjer der er i filen / etc / passwd.
Tip: Brug wc -l / etc / passwd
  1. Find nu alle forekomster af teksten var i filen / etc / passwd.
  2. Find ud af, hvor mange linjer i filen der indeholder teksten
  3. Find ud af, hvor mange linjer der IKKE indeholder teksten var.
  4. Find posten til dit login i / etc / passwd

Træningsløsninger findes i slutningen af ​​denne artikel.

Brug af regulære udtryk

Kommandoen grep kan også bruges med regulære udtryk ved at bruge et eller flere af elleve specialtegn eller symboler til at forfine søgningen. Et regulært udtryk er en tegnstreng, der indeholder specialtegn for at muliggøre mønstermatchning i hjælpeprogrammer som f.eks grep, vim og sed. Bemærk, at strengene muligvis skal være anbragt i anførselstegn.

De tilgængelige specialtegn inkluderer:

^ Start af en linje
$ Slutningen af ​​en linje
. Ethvert tegn (undtagen \ n ny linje)
* 0 eller flere af det tidligere udtryk
\ Forud for et symbol gør det til en bogstavelig karakter

Bemærk, at *, som kan bruges på kommandolinjen til at matche et hvilket som helst antal tegn inklusive ingen, er ikke bruges på samme måde her.

Bemærk også brugen af ​​tilbud i de følgende eksempler.

Eksempler

Sådan finder du alle linjer, der starter med tekst ved hjælp af tegnet ^:

$ grep '^ xyz' myfile

Sådan finder du alle linjer, der slutter med tekst ved hjælp af $ -tegnet:

$ grep 'xyz $' myfile

Sådan finder du linjer, der indeholder en streng, der bruger både ^ og $ tegn:

$ grep '^ xyz $' myfile

For at finde linjer ved hjælp af . for at matche ethvert tegn:

$ grep '^ x.z 'myfile

Sådan finder du linjer ved hjælp af * til at matche 0 eller flere af det foregående udtryk:

$ grep '^ xy * z' myfile

For at finde linjer ved hjælp af .* for at matche 0 eller flere af et hvilket som helst tegn:

$ grep '^ x.* z 'myfile

For at finde linjer ved hjælp af \ at undslippe * karakteren:

$ grep '^ x \ * z' myfil

For at finde \ tegn brug:

$ grep '\\' myfile

Udtryksgrep - egrep

Det grep kommandoen understøtter kun en delmængde af de tilgængelige regulære udtryk. Men kommandoen egrep:

Bemærk, at udtrykkene skal være lukket i et par citater.

For at bruge farver skal du bruge -farve eller igen oprette et alias:

$ alias egrep = 'egrep --farve'

For at søge efter mere end en regex det egrep kommandoen kan skrives over flere linjer. Dette kan dog også gøres ved hjælp af disse specialtegn:

| Alternativ, den ene eller den anden
(…) Logisk gruppering af en del af et udtryk
$ egrep '(^ root | ^ uucp | ^ mail)' / etc / passwd

Dette udtrækker de linjer, der begynder med rod, uucp eller mail fra filen, | symbol, der betyder en af ​​mulighederne.

Den følgende kommando vil ikke arbejde, selvom der ikke vises nogen besked, da grundlæggende grep kommando understøtter ikke alle regulære udtryk:

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

Men på de fleste Linux-systemer kommandoen grep -E er det samme som at bruge egrep:

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

Brug af filtre

Rørledning er processen med at sende output fra en kommando som input til en anden kommando og er et af de mest kraftfulde Linux-værktøjer, der er tilgængelige.

Kommandoer, der vises i en pipeline, omtales ofte som filtre, da de i mange tilfælde siver igennem eller ændrer det input, der sendes til dem, før de sender den modificerede stream til standardoutput.

I det følgende eksempel, standard output fra ls -l sendes som standard input til grep kommando. Output fra grep kommandoen sendes derefter som input til mere kommando.

Dette viser kun mapper i /etc:

$ ls -l / etc | grep '^ d' | mere

Følgende kommandoer er eksempler på brug af filtre:

$ ps -ef | grep cron

$ hvem | grep kdm

Prøvefil

For at prøve gennemgangsøvelsen skal du først oprette følgende eksempelfil.

Brug en editor som nano eller vim til at kopiere nedenstående tekst til en fil, der hedder mennesker:

Personlig J.Smith 25000
Personlig E.Smith 25400
Træning A.Brun 27500
Træning C.Browen 23400
(Administrator) R.Bron 30500
Goodsout T.Smyth 30000
Personlig F.Jones 25000
træning * C.Evans 25500
Goodsout W.Pave 30400
Stueetage T.Smythe 30500
Personlig J.Maler 33000

Øvelse II

  1. Vis filen mennesker og undersøge dens indhold.
  2. Find alle linjer, der indeholder strengen Smith i filen mennesker.Tip: Brug kommandoen grep, men husk at det som standard er store og små bogstaver.
  3. Opret en ny fil, npeople, der indeholder alle linjer, der begynder med strengen Personlig i folkeregistret.Tip: Brug kommandoen grep med>.
  4. Bekræft indholdet af filen npeople ved at angive filen.
  5. Tilføj nu alle linjer, hvor teksten slutter med strengen 500 i filen folk til filen npeople.Tip: Brug kommandoen grep med >>.
  6. Bekræft igen indholdet af filen npeople ved at angive filen.
  7. Find IP-adressen på den server, der er gemt i filen / etc / hosts.Tip: Brug kommandoen grep med $ (hostname)
  8. Brug egrep at udtrække fra / etc / passwd filkontolinjer indeholdende lp eller din egen bruger ID.

Træningsløsninger findes i slutningen af ​​denne artikel.

Flere regulære udtryk

Et regelmæssigt udtryk kan betragtes som wildcards på steroider.

Der er elleve tegn med særlig betydning: åbnings- og lukning af firkantede parenteser [], omvendt skråstreg \, tegnet ^, dollartegnet $, punktum eller prik ., det lodrette bjælke- eller rørsymbol | spørgsmålstegnet ?, stjerne eller stjerne *, plustegnet + og åbnings- og lukningsrunde parentes . Disse specialtegn kaldes også ofte metategn.

Her er det fulde sæt specialtegn:

^ Start af en linje
$ Slutningen af ​​en linje
. Ethvert tegn (undtagen \ n ny linje)
* 0 eller flere af det tidligere udtryk
| Alternativ, enten den ene eller den anden
[…] Eksplicit sæt tegn, der skal matches
+ 1 eller flere af tidligere udtryk
? 0 eller 1 i det foregående udtryk
\ Forud for et symbol gør det til en bogstavelig karakter
Eksplicit kvantificeringsnotation
(…) Logisk gruppering af en del af et udtryk

Standardversionen af grep har kun begrænset understøttelse af regelmæssigt udtryk. For at alle følgende eksempler skal fungere, skal du bruge egrep i stedet for eller grep -E.

For at finde linjer ved hjælp af | for at matche begge udtryk:

$ egrep 'xxz | xzz' myfile

For at finde linjer ved hjælp af | for at matche begge udtryk i en streng skal du også bruge ():

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

Sådan finder du linjer, der bruger [] til at matche ethvert tegn:

$ egrep '^ x [Yy] z' myfile

Sådan finder du linjer, der bruger [] til IKKE at matche noget tegn:

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

Sådan finder du linjer ved hjælp af * til at matche 0 eller flere af det foregående udtryk:

$ egrep '^ xy * z' myfile

Sådan finder du linjer ved hjælp af + til at matche 1 eller flere af det foregående udtryk:

$ egrep '^ xy + z' myfile

For at finde linjer ved hjælp af ? for at matche 0 eller 1 i det foregående udtryk:

$ egrep '^ xy?z 'myfile

Øvelse III

  1. Find alle linjer, der indeholder navnene Evans eller Maler i filen mennesker.
  2. Find alle linjer, der indeholder navnene Smith, Smyth eller Smythe i filen mennesker.
  3. Find alle linjer, der indeholder navnene Brun, Browen eller Bron i filen mennesker.Hvis du har tid:
  4. Find linjen, der indeholder strengen (admin), inklusive parenteser, i filen folk.
  5. Find linjen, der indeholder tegnet * i filen People.
  6. Kombiner 5 og 6 ovenfor for at finde begge udtryk.

Flere eksempler

For at finde linjer ved hjælp af . og * for at matche ethvert sæt tegn:

$ egrep '^ xy.* z 'myfile

Sådan finder du linjer, der bruger til at matche N antal tegn:

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

Sådan finder du linjer, der bruger til at matche N eller flere gange:

$ egrep '^ xy 3, z' myfile

Sådan finder du linjer, der bruger til at matche N gange, men ikke mere end M gange:

$ egrep '^ xy 2,3 z' myfile

Konklusion

I denne vejledning så vi først på at bruge grep i sin enkle form til at finde tekst i en fil eller i flere filer. Vi kombinerede derefter den tekst, der skulle søges efter, med enkle regulære udtryk og derefter mere komplekse med egrep.

Næste skridt

Jeg håber, du vil bruge den vundne viden her til god brug. Prøv grep kommandoer på dine egne data og husk, regelmæssige udtryk som beskrevet her kan bruges i samme form i vi, sed og akavet!

Træningsløsninger

Øvelse I

Tæl først, hvor mange linjer der er i filen / etc / passwd.
$ wc -l / etc / passwd
Find nu alle forekomster af teksten var i filen / etc / passwd.
$ grep var / etc / passwd
Find ud af, hvor mange linjer i filen der indeholder teksten var

grep -c var / etc / passwd

Find ud af, hvor mange linjer der IKKE indeholder teksten var.

grep -cv var / etc / passwd

Find posten til dit login i / etc / passwd fil
grep kdm / etc / passwd

Øvelse II

Vis filen mennesker og undersøge dens indhold.
$ kat mennesker
Find alle linjer, der indeholder strengen Smith i filen mennesker.
$ grep 'Smith' folk
Opret en ny fil, mennesker, der indeholder alle linjer, der begynder med strengen Personlig i mennesker fil
$ grep '^ Personlige' mennesker> mennesker
Bekræft indholdet af filen mennesker ved at angive filen.
$ kat npeople
Tilføj nu alle linjer, hvor teksten slutter med strengen 500 i filen mennesker til filen mennesker.
$ grep '500 $' mennesker >> mennesker
Bekræft igen indholdet af filen mennesker ved at angive filen.
$ kat npeople
Find IP-adressen på den server, der er gemt i filen / etc / hosts.
$ grep $ (værtsnavn) / etc / hosts
Brug egrep at udtrække fra / etc / passwd filkontolinjer indeholdende lp eller dit eget bruger-id.
$ egrep '(lp | kdm :)' / etc / passwd

Øvelse III

Find alle linjer, der indeholder navnene Evans eller Maler i filen mennesker.
$ egrep 'Evans | Maler' folk
Find alle linjer, der indeholder navnene Smith, Smyth eller Smythe i filen mennesker.
$ egrep 'Sm (i | y)?folk
Find alle linjer, der indeholder navnene Brun, Browen eller Bron i filen mennesker.
$ egrep 'Brow?e?n 'mennesker
Find linjen, der indeholder strengen (admin), inklusive parenteser i filen mennesker.

$ egrep '\ (Admin \)' personer

Find linjen, der indeholder tegnet * i filen mennesker.
$ egrep '\ *' folk
Kombiner 5 og 6 ovenfor for at finde begge udtryk.

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


Top Oculus App Lab-spil
Hvis du er Oculus-headset-ejer, skal du være opmærksom på sideloading. Sideladning er processen med at installere ikke-butiksindhold på dit headset. S...
Top 10 spil at spille på Ubuntu
Windows-platform har været en af ​​de dominerende platforme til spil på grund af den enorme procentdel af spil, der udvikler sig i dag til indbygget a...
5 bedste arkadespil til Linux
I dag er computere seriøse maskiner, der bruges til spil. Hvis du ikke kan få den nye høje score, ved du hvad jeg mener. I dette indlæg vil du kende n...