Använda grep (och egrep) med reguljära uttryck

Using Grep With Regular Expressions



Denna handledning beskriver hur du använder båda grepp (och egrep) t o hitta text i filer, i sin enkla form och i kombination med vanliga uttryck. Den innehåller flera exempel och övningar , Mer lösningar , för tittaren att slutföra.

Namnet grepp kommer från kommandot ed (och vim) g/re/p, vilket innebär att globalt söka efter ett givet reguljärt uttryck och skriva ut (visa) utdata.







Regelbunden Uttryck

Verktygen låter användaren söka efter textfiler efter rader som matchar ett vanligt uttryck ( regexp ). Ett vanligt uttryck är en söksträng som består av text och ett eller flera av 11 specialtecken. Ett enkelt exempel är att matcha början på en rad.



Exempelfil

Grundformen för grepp kan användas för att hitta enkel text i en eller flera specifika filer. För att prova exemplen, skapa först exempelfilen.



Använd en redigerare som nano eller vim för att kopiera texten nedan till 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

Även om du kan kopiera och klistra in exemplen i texten (notera att dubbla citattecken kanske inte kopierar ordentligt), måste kommandon skrivas in för att lära dem ordentligt.

Innan du provar exemplen, se exempelfilen:



$kattmin fil

Enkel sökning

För att hitta texten 'xyz' i filen kör du följande:

$greppxyz myfile

Använda färger

För att visa färger, använd –color (en dubbel bindestreck) eller skapa helt enkelt ett alias. Till exempel:

$grepp --Färgxyz myfile

eller

$alias grepp= ’grepp--Färg'
$greppxyz myfile

alternativ

Vanliga alternativ som används med grepp kommandot inkluderar:

  • -jag hittar alla rader oavsett av fall
  • -c räkna hur många rader innehåller texten
  • -n displayrad tal av matchande linjer
  • -l endast display fil namn den matchen
  • -r rekursiv sökning i underkataloger
  • -v hitta alla rader INTE som innehåller texten

Till exempel:

$grepp -ixyz myfile# hitta text oavsett fall

$grepp -icxyz myfile# räkna rader med text

$grepp -ixyz myfile# visa radnummer

Skapa flera filer

Innan du försöker söka efter flera filer, skapa först flera nya filer:

$kastade utxyz>myfile1
$kastade ut -Ochxyz nxzz nXYZ>myfile2
$kastade ut -Ochxxx nyyy>myfile3
$kattmyfile1
$kattmyfile2
$kattmyfile3

Sök i flera filer

Om du vill söka efter flera filer med filnamn eller jokertecken anger du:

$grepp -icxyz myfile myfile1 myfile2 myfile3
$grepp -ixyz min*
# matcha filnamn som börjar med 'mitt'

Övning I

  1. Räkna först hur många rader det finns i filen /etc /passwd.
Tips: användtoalett -de /etc/passwd
  1. Hitta nu alla förekomster av texten var i filen /etc /passwd .
  2. Hitta hur många rader i filen som innehåller texten
  3. Hitta hur många rader som INTE innehåller texten var .
  4. Hitta posten för din inloggning i /etc/passwd

Träningslösningar finns i slutet av denna artikel.

Använda reguljära uttryck

Kommandot grepp kan också användas med reguljära uttryck genom att använda ett eller flera av elva specialtecken eller symboler för att förfina sökningen. Ett reguljärt uttryck är en teckensträng som innehåller specialtecken för att tillåta mönstermatchning inom verktyg som t.ex. grepp , jag kom och sed . Observera att strängarna kan behöva ingå i citattecken.

Specialtecknen som finns tillgängliga inkluderar:

^ Början på en rad
$ Slut på en rad
. Alla tecken (förutom n ny rad)
* 0 eller mer av tidigare uttryck
Att föregå en symbol gör det till en bokstavlig karaktär

Observera att *, som kan användas på kommandoraden för att matcha valfritt antal tecken inklusive inga, är inte används på samma sätt här.

Observera också användningen av citattecken i följande exempel.

Exempel

För att hitta alla rader som börjar med text med ^ -tecknet:

$grepp'^Xyz' myfile

För att hitta alla rader som slutar med text med $ -tecknet:

$grepp'Xyz $' myfile

Så här hittar du rader som innehåller en sträng med både ^ och $ tecken:

$grepp‘^Xyz $’ myfile

För att hitta rader med . för att matcha valfri karaktär:

$grepp‘^X.z’ myfile

Så här hittar du rader med * för att matcha 0 eller mer av det tidigare uttrycket:

$grepp‘^Xy*från min fil

För att hitta rader med.* För att matcha 0 eller mer av ett tecken:

$grepp‘^ X.*från min fil

För att hitta rader med för att undkomma * karaktären:

$grepp'^ X *från min fil

Använd tecknet för att hitta:

$grepp'\' min fil

Uttryck grep - egrep

De grepp kommandot stöder endast en delmängd av de reguljära uttryck som finns tillgängliga. Men kommandot egrep:

  • tillåter full användning av alla reguljära uttryck
  • kan samtidigt söka efter mer än ett uttryck

Observera att uttrycken måste ingå i ett par citattecken.

För att använda färger, använd –färg eller skapa igen ett alias:

$alias egrep='egrep -färg'

För att söka efter mer än en regex de egrep kommandot kan skrivas över flera rader. Detta kan dock också göras med hjälp av dessa specialtecken:

| Alternativ, antingen det ena eller det andra
(…) Logisk gruppering av en del av ett uttryck
$egrep '(^root |^uucp |^mail)' /etc/passwd

Detta extraherar raderna som börjar med root, uucp eller mail från filen,. symbol som betyder något av alternativen.

Följande kommando kommer inte fungerar, även om inget meddelande visas, eftersom grundläggande grepp kommandot stöder inte alla reguljära uttryck:

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

Men på de flesta Linux -system är kommandot grep -E är detsamma som att använda egrep :

$grepp -OCH '(^root |^uucp |^mail)' /etc/passwd

Använda filter

Rör är processen att skicka utmatningen av ett kommando som inmatning till ett annat kommando och är ett av de mest kraftfulla Linux -verktygen som finns.

Kommandon som visas i en pipeline kallas ofta filter eftersom de i många fall siktar igenom eller ändrar ingången som skickas till dem innan den modifierade strömmen skickas till standardutmatning.

I följande exempel, standardutmatning från ls -l skickas som standardinmatning till grepp kommando. Utmatning från grepp kommandot skickas sedan som input till Mer kommando.

Detta visar bara kataloger i /etc :

$ls -de /etc|grepp‘^D’|Mer

Följande kommandon är exempel på användning av filter:

$ps -ef|greppcron

$WHO|greppkdm

Exempelfil

För att prova granskningsövningen, skapa först följande exempelfil.

Använd en redigerare som nano eller vim för att kopiera texten nedan till en fil som heter människor:

Personlig J.Smith 25000
Personlig E.Smith 25400
Utbildning A.Brown 27500
Utbildning C.Browen 23400
(Admin) R.Bron 30500
Goodsout T.Smyth 30000
Personlig F.Jones 25000
utbildning* C.Evans 25500
Goodsout W.Pope 30400
Bottenvåning T.Smythe 30500
Personlig J.Maler 33000

Övning II

  1. Visa filen människor och undersöka dess innehåll.
  2. Hitta alla rader som innehåller strängen Smed i filen people.Hint: använd kommandot grep men kom ihåg att det som standard är skiftlägeskänsligt.
  3. Skapa en ny fil, npeople, som innehåller alla rader som börjar med strängen Personlig i folkfilen.Hint: använd kommandot grep med>.
  4. Bekräfta innehållet i filen npeople genom att lista filen.
  5. Lägg nu till alla rader där texten slutar med strängen 500 i filen folk till filen npeople.Hint: använd kommandot grep med >>.
  6. Återigen, bekräfta innehållet i filen npeople genom att lista filen.
  7. Hitta IP -adressen för servern som är lagrad i filen /etc/hosts .Hint: använd kommandot grep med $ (värdnamn)
  8. Använda sig av egrep att extrahera från /etc/passwd filkontokader som innehåller lp eller din egen användar ID .

Träningslösningar finns i slutet av denna artikel.

Fler reguljära uttryck

Ett vanligt uttryck kan betraktas som jokertecken på steroider.

Det finns elva tecken med speciella betydelser: öppning och stängning av hakparenteser [], snedstrecket , huvudet ^, dollarstecknet $, punkten eller pricken., Den vertikala stapeln eller rörsymbolen |, frågetecknet?, asterisk eller stjärna *, plustecknet + och öppnings- och stängningsfästet {}. Dessa specialtecken kallas också ofta för metatecken.

Här är hela uppsättningen specialtecken:

^ Början på en rad
$ Slut på en rad
. Alla tecken (förutom n ny rad)
* 0 eller mer av tidigare uttryck
| Alternativ, antingen det ena eller det andra
[…] Explicit uppsättning tecken att matcha
+ 1 eller fler av tidigare uttryck
? 0 eller 1 av föregående uttryck
Att föregå en symbol gör det till en bokstavlig karaktär
{…} Explicit kvantifieringsnotation
(…) Logisk gruppering av en del av ett uttryck

Standardversionen av grepp har endast begränsat reguljärt uttrycksstöd. För att alla följande exempel ska fungera, använd egrep istället eller grep -E .

För att hitta rader med | för att matcha något av uttrycket:

$egrep'Xxz|xzz 'min fil

För att hitta rader med | För att matcha något av uttrycket i en sträng använder du också ():

$egrep‘^ X(Yz|yz)' min fil

Så här hittar du rader med [] för att matcha alla tecken:

$egrep‘^ X[Åh]från min fil

För att hitta rader med [] för att INTE matcha något tecken:

$egrep‘^ X[^ Åh]från min fil

Så här hittar du rader med * för att matcha 0 eller mer av det tidigare uttrycket:

$egrep‘^Xy*från min fil

Så här hittar du rader med + för att matcha 1 eller flera av föregående uttryck:

$egrep‘^Xy+z’ myfile

För att hitta linjer med? för att matcha 0 eller 1 i det föregående uttrycket:

$egrep‘^Xy? Z’ myfile

Övning III

  1. Hitta alla rader som innehåller namnen Evans eller målare i filen människor.
  2. Hitta alla rader som innehåller namnen Smith, Smyth eller Smythe i filen människor.
  3. Hitta alla rader som innehåller namnen Brown, Browen eller Källa i filen people.If du har tid:
  4. Hitta raden som innehåller strängen (administration), inklusive parenteser, i filfolket.
  5. Hitta raden som innehåller tecknet * i filfolket.
  6. Kombinera 5 och 6 ovan för att hitta båda uttrycken.

Fler exempel

För att hitta rader med . och * för att matcha alla teckenuppsättningar:

$egrep‘^Xy.*från min fil

Så här hittar du rader med {} för att matcha N antal tecken:

$egrep‘^Xy{3}från min fil
$egrep‘^Xy{4}från min fil

Så här hittar du rader med {} för att matcha N eller fler gånger:

$egrep‘^Xy{3,}från min fil

Så här hittar du rader med {} för att matcha N gånger men inte mer än M gånger:

$egrep‘^Xy{2,3}från min fil

Slutsats

I denna handledning tittade vi först på att använda grepp i sin enkla form för att hitta text i en fil eller i flera filer. Vi kombinerade sedan texten som ska sökas efter med enkla reguljära uttryck och sedan mer komplexa med egrep .

Nästa steg

Jag hoppas att du kommer att använda den kunskap som du fått här till god nytta. Prova grepp kommandon på dina egna data och kom ihåg, reguljära uttryck som beskrivs här kan användas i samma form i vi , sed och ock !

Träningslösningar

Övning I

Räkna först hur många rader det finns i filen /etc/passwd .
$ wc -l /etc/passwd
Hitta nu alla förekomster av texten var i filen /etc /passwd.
$ grep var /etc/passwd
Hitta hur många rader i filen som innehåller texten var

grepp -cvar/etc/passwd

Hitta hur många rader som INTE innehåller texten var .

grepp -CVvar/etc/passwd

Hitta posten för din inloggning i /etc/passwd fil
grep kdm /etc/passwd

Övning II

Visa filen människor och undersöka dess innehåll.
$ cat people
Hitta alla rader som innehåller strängen Smed i filen människor .
$ grep 'Smith' people
Skapa en ny fil, nfolk , som innehåller alla rader som börjar med strängen Personlig i människor fil
$ grep '^Personal' people> npeople
Bekräfta innehållet i filen nfolk genom att lista filen.
$ cat npeople
Lägg nu till alla rader där texten slutar med strängen 500 i filen människor till filen nfolk .
$ grep '500$' people>>npeople
Bekräfta igen innehållet i filen nfolk genom att lista filen.
$ cat npeople
Hitta IP -adressen för servern som är lagrad i filen /etc/hosts .
$ grep $(hostname) /etc/hosts
Använda sig av egrep att extrahera från /etc/passwd filkontokader som innehåller lp eller ditt eget användar -id.
$ egrep '(lp|kdm:)' /etc/passwd

Övning III

Hitta alla rader som innehåller namnen Evans eller målare i filen människor .
$ egrep 'Evans|Maler' people
Hitta alla rader som innehåller namnen Smed , Smyth eller Smythe i filen människor .
$ egrep 'Sm(i|y)the?' people
Hitta alla rader som innehåller namnen Brun , Browen eller Källa i filen människor.
$ egrep 'Brow?e?n' people
Hitta raden som innehåller strängen (administration), inklusive parentes, i filen människor .

$egrep '(Administration)'människor

Hitta raden som innehåller tecknet * i filen människor.
$ egrep '*' people
Kombinera 5 och 6 ovan för att hitta båda uttrycken.

$egrep ' (Admin ) | *'människor