Namnet grep kommer från ed (och vim) -kommandot “g / re / p”, vilket betyder att globalt söka efter ett visst reguljärt uttryck och skriva ut (visa) utdata.
Regelbunden Uttryck
Verktygen tillåter användaren att söka i textfiler efter rader som matchar ett vanligt uttryck (regexp). Ett reguljärt uttryck är en söksträng som består av text och en eller flera av 11 specialtecken. Ett enkelt exempel är att matcha början på en rad.
Exempel på fil
Den grundläggande formen av grep kan användas för att hitta enkel text i en viss fil eller filer. För att prova exemplen skapar du först exempelfilen.
Använd en redigerare som nano eller vim för att kopiera texten nedan till en fil som heter min fil.
xyzxyzde
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 (observera att dubbla citat kanske inte kopieras ordentligt) måste kommandon skrivas för att lära sig dem ordentligt.
Innan du provar exemplen, se exempelfilen:
$ cat myfile
Enkel sökning
För att hitta texten 'xyz' i filen kör du följande:
$ grep xyz myfile
Använda färger
För att visa färger, använd -color (ett dubbel bindestreck) eller skapa helt enkelt ett alias. Till exempel:
$ grep --color xyz myfileeller
$ alias grep = 'grep - färg'$ grep xyz myfile
alternativ
Vanliga alternativ som används med grep kommandot inkluderar:
- -jag hittar alla rader oavsett i fallet
- -c räkna hur många rader som innehåller texten
- -n displayrad tal av matchande rader
- -Jag visar bara fil namn den matchen
- -r rekursiv sökning av underkataloger
- -v hitta alla rader INTE som innehåller texten
Till exempel:
$ grep -i xyz myfile # hitta text oavsett fall$ grep -ic xyz myfile # räknar rader med text
$ grep -in xyz myfile # visa radnummer
Skapa flera filer
Innan du försöker söka i flera filer, skapa först flera nya filer:
$ echo xyz> myfile1$ echo -e “xyz \ nxzz \ nXYZ”> myfil2
$ echo -e “xxx \ nyyy”> minfil3
$ cat myfile1
$ cat myfile2
$ cat myfile3
Sök i flera filer
För att söka i flera filer med filnamn eller ett jokertecken anger du:
$ grep -ic xyz myfile myfile1 myfile2 myfile3$ grep -in xyz my *
# matchningsfilnamn som börjar med "min"
Övning I
- Räkna först hur många rader det finns i filen / etc / passwd.
- Hitta nu alla förekomster av texten var i filen / etc / passwd.
- Hitta hur många rader i filen som innehåller texten
- Hitta hur många rader som INTE innehåller texten var.
- Hitta posten för din inloggning i / etc / passwd
Träningslösningar finns i slutet av den här artikeln.
Använda reguljära uttryck
Kommandot grep kan också användas med reguljära uttryck genom att använda en 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 möjliggöra mönstermatchning i verktyg som grep, vim och sed. Observera att strängarna kan behöva bifogas i citat.
Tillgängliga specialtecken inkluderar:
^ | Början på en rad |
$ | Slut på en rad |
. | Alla tecken (utom \ n ny rad) |
* | 0 eller fler av tidigare uttryck |
\ | Före 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 inget, är inte används på samma sätt här.
Notera också användningen av citat i följande exempel.
Exempel
För att hitta alla rader som börjar med text med ^ -tecknet:
$ grep '^ xyz' myfilSå här hittar du alla rader som slutar med text med $ -tecknet:
$ grep 'xyz $' myfileSå här hittar du rader som innehåller en sträng med både ^ och $ tecken:
$ grep '^ xyz $' myfileFör att hitta linjer med hjälp av . för att matcha alla karaktärer:
$ grep '^ x.z 'myfile
För att hitta rader med * för att matcha 0 eller fler av föregående uttryck:
$ grep '^ xy * z' myfileFör att hitta linjer med .* för att matcha 0 eller fler av vilket tecken som helst:
$ grep '^ x.* z 'myfileFör att hitta linjer med hjälp av \ för att undkomma * karaktären:
$ grep '^ x \ * z' minfilFör att hitta \ karaktären använd:
$ grep '\\' myfile
Uttryck grep - egrep
De grep kommandot stöder endast en delmängd av de tillgängliga reguljära uttrycken. Men kommandot egrep:
- tillåter fullständig användning av alla reguljära uttryck
- kan samtidigt söka efter mer än ett uttryck
Observera att uttrycken måste vara inneslutna i ett par citat.
För att använda färger, använd -color eller skapa igen ett alias:
$ alias egrep = 'egrep --color'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 följande specialtecken:
| | Alternativ, antingen den ena eller den andra |
(…) | Logisk gruppering av en del av ett uttryck |
Detta extraherar raderna som börjar med root, uucp eller e-post från filen, | symbol som betyder något av alternativen.
Följande kommando kommer inte fungerar, även om inget meddelande visas, eftersom grundläggande grep kommandot stöder inte alla reguljära uttryck:
$ grep '(^ root | ^ uucp | ^ mail)' / etc / passwdMen på de flesta Linux-system är kommandot grep -E är samma som att använda egrep:
$ grep -E '(^ root | ^ uucp | ^ mail)' / etc / passwd
Använda filter
Rör är processen för att skicka utdata från 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 de skickar den modifierade strömmen till standardutdata.
I följande exempel, standardutdata från ls -l överförs som standardingång till grep kommando. Produktion från grep kommandot skickas sedan som inmatning till Mer kommando.
Detta visar endast kataloger i /etc:
$ ls -l / etc | grep '^ d' | mer
Följande kommandon är exempel på användning av filter:
$ ps -ef | grep cron$ vem | grep kdm
Exempel på fil
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 25000Personlig E.Smith 25400
Utbildning A.Brun 27500
Utbildning C.Browen 23400
(Admin) R.Bron 30500
Goodsout T.Smyth 30000
Personlig F.Jones 25000
utbildning * C.Evans 25500
Goodsout W.Påven 30400
Bottenvåning T.Smythe 30500
Personlig J.Maler 33000
Övning II
- Visa filen människor och undersöka dess innehåll.
- Hitta alla rader som innehåller strängen Smed i filen människor.Tips: använd kommandot grep men kom ihåg att det som standard är skiftlägeskänsligt.
- Skapa en ny fil, npeople, som innehåller alla rader som börjar med strängen Personlig i folkomtalet.Tips: använd kommandot grep med>.
- Bekräfta innehållet i filen npeople genom att lista filen.
- Lägg nu till alla rader där texten slutar med strängen 500 i filen människor till filen npeople.Tips: använd kommandot grep med >>.
- Bekräfta igen innehållet i filen npeople genom att lista filen.
- Hitta IP-adressen till servern som är lagrad i filen / etc / värdar.Tips: använd kommandot grep med $ (värdnamn)
- Använda sig av egrep att extrahera från / etc / passwd filkonto rader som innehåller lp eller din egen användar ID.
Träningslösningar finns i slutet av den här artikeln.
Fler reguljära uttryck
Ett vanligt uttryck kan ses som jokertecken på steroider.
Det finns elva tecken med speciella betydelser: de inledande och stängande hakparenteserna [], backslash \, markören ^, dollartecknet $, perioden eller punkten ., den vertikala stapeln eller rörsymbolen |, frågetecknet ?, asterisken eller stjärnan *, plustecknet + och öppnings- och stängningsrundfästet . Dessa specialtecken kallas också ofta metatecken.
Här är hela uppsättningen specialtecken:
^ | Början på en rad |
$ | Slut på en rad |
. | Alla tecken (utom \ n ny rad) |
* | 0 eller fler av tidigare uttryck |
| | Alternativ, antingen den ena eller den andra |
[…] | Explicit uppsättning tecken att matcha |
+ | 1 eller fler av tidigare uttryck |
? | 0 eller 1 i föregående uttryck |
\ | Före en symbol gör det till en bokstavlig karaktär |
... | Explicit kvantifieringsnotation |
(…) | Logisk gruppering av en del av ett uttryck |
Standardversionen av grep har endast begränsat stöd för regelbundet uttryck. För att alla följande exempel ska fungera, använd egrep istället eller grep -E.
För att hitta linjer med hjälp av | för att matcha något av uttrycken:
$ egrep 'xxz | xzz' minfilFör att hitta linjer med | för att matcha något av uttrycken i en sträng använd också ():
$ egrep '^ x (Yz | yz)' minfil
Så här hittar du rader med [] för att matcha vilket tecken som helst:
$ egrep '^ x [Yy] z' myfileSå här hittar du rader som använder [] för att INTE matcha något tecken:
$ egrep '^ x [^ Yy] z' myfileFör att hitta rader med * för att matcha 0 eller fler av föregående uttryck:
$ egrep '^ xy * z' minfil
För att hitta rader med + för att matcha 1 eller fler av föregående uttryck:
$ egrep '^ xy + z' minfilFör att hitta linjer med hjälp av ? för att matcha 0 eller 1 i föregående uttryck:
$ egrep '^ xy?z 'myfile
Övning III
- Hitta alla rader som innehåller namnen Evans eller Maler i filen människor.
- Hitta alla rader som innehåller namnen Smith, Smyth eller Smythe i filen människor.
- Hitta alla rader som innehåller namnen Brun, Browen eller Bron i filen människor.Om du har tid:
- Hitta raden som innehåller strängen (administration), inklusive parenteser, i filen personer.
- Hitta raden som innehåller tecknet * i filen personer.
- Kombinera 5 och 6 ovan för att hitta båda uttrycken.
Fler exempel
För att hitta linjer med . och * för att matcha alla teckenuppsättningar:
$ egrep '^ xy.* z 'myfileSå här hittar du rader med för att matcha N antal tecken:
$ egrep '^ xy 3 z' minfil$ egrep '^ xy 4 z' minfil
Så här hittar du rader med för att matcha N eller flera gånger:
$ egrep '^ xy 3, z' myfileSå här hittar du rader som använder för att matcha N gånger men inte mer än M gånger:
$ egrep '^ xy 2,3 z' myfile
Slutsats
I denna handledning tittade vi först på att använda grep i sin enkla form för att hitta text i en fil eller i flera filer. Vi kombinerade sedan texten som ska sökas med enkla reguljära uttryck och sedan mer komplexa med egrep.
Nästa steg
Jag hoppas att du kommer att utnyttja den kunskap som erhållits här. Prova grep 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 awk!
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
Hitta hur många rader som INTE innehåller texten var.
grep -cv var / etc / passwdHitta posten för din inloggning i / etc / passwd filgrep kdm / etc / passwd
Övning II
Visa filen människor och undersöka dess innehåll.$ kattfolk
Hitta alla rader som innehåller strängen Smed i filen människor.$ grep-folk från Smith
Skapa en ny fil, människor, som innehåller alla rader som börjar med strängen Personlig i människor fil$ grep '^ Personliga' människor> människor
Bekräfta innehållet i filen människor genom att lista filen.$ kattpersoner
Lägg nu till alla rader där texten slutar med strängen 500 i filen människor till filen människor.$ grep '500 $' människor >> människor
Bekräfta igen innehållet i filen människor genom att lista filen.$ kattpersoner
Hitta IP-adressen till servern som är lagrad i filen / etc / värdar.$ grep $ (värdnamn) / etc / värdar
Använda sig av egrep att extrahera från / etc / passwd filkonto rader 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 Maler i filen människor.$ egrep 'Evans | Maler' -folk
Hitta alla rader som innehåller namnen Smed, Smyth eller Smythe i filen människor.$ egrep 'Sm (i | y)?' människor
Hitta alla rader som innehåller namnen Brun, Browen eller Bron i filen människor.$ egrep 'Brow?e?n 'människor
Hitta raden som innehåller strängen (administration), inklusive parenteser i filen människor.
Hitta raden som innehåller karaktären * i filen människor.$ egrep '\ *' personer
Kombinera 5 och 6 ovan för att hitta båda uttrycken.