Linux grep-kommandot används som en metod för filtrering av inmatning. GREP står för Global Regular Expression Printer och därför bör du ha kunskap om reguljära uttryck för att kunna använda det effektivt.
I den här artikeln kommer du att lära dig ett antal exempel som hjälper dig att förstå grep-kommandot.
01 av 09Hur man söker efter en sträng i en fil med hjälp av GREP
Tänk dig att du har en textfil kallad böcker med följande barns boktitlar:
- Robin Hood
- Lilla Rödluvan
- Peter Pan
- Guldlock och de tre björnarna
- Snövit och de sju dvärgarna
- Pinnochio
- Katten i hatten
- De tre små grisarna
- Gruffalo
- Kalle och chokladfabriken
För att hitta alla böcker med ordet "The" i titeln skulle du använda följande syntax:
grep böckernaFöljande resultat kommer att returneras:
- Guldlock och de tre björnarna
- Snövit och de sju dvärgarna
- Katten i hatten
- De tre små grisarna
- Gruffalo
- Kalle och chokladfabriken
I varje fall kommer ordet "The" att markeras.
Sökningen är skiftlägeskänslig, så om en av titlarna hade "den" istället för "The" skulle den inte ha returnerats.
För att ignorera fallet kan du lägga till följande omkopplare:
grep böckerna --ignore-caseDu kan också använda -i-omkopplaren enligt följande:
Fortsätt läsa nedan
02 av 09Sök efter en sträng i en fil med jokertecken
Grep-kommandot är mycket kraftfullt. Du kan använda en mängd mönstermatchningstekniker för att filtrera resultat.
I det här exemplet kommer jag att visa dig hur man söker efter en sträng i en fil med jokertecken.
Tänk dig att du har en fil som heter platser med följande skotska platsnamn:
aberdeenaberystwythAberlourinverurieinvernessnewburghny hjortny gallowayglasgowedinburghOm du vill hitta alla platser med inver i namnet använd följande syntax:
grep inver * platserDen asteriska (*) jokertecken står för 0 eller många. Därför om du har en plats som kallas inver eller en plats som heter Inverness, så skulle båda returneras.
Ett annat jokertecken som du kan använda är perioden (.). Du kan använda detta för att matcha ett enstaka brev.
grep inver.r platserOvanstående kommando skulle hitta platser som kallas inverurie och inverary men skulle inte hitta invereerie eftersom det bara kan vara ett jokertecken mellan de två r som betecknas av den enskilda perioden.
Perioden wildcard är användbar men det kan orsaka problem om du har en som en del av texten du söker.
Titta till exempel på den här listan över domännamn
- linux.about.com
- pcsupport.about.com
- mp3.about.com
- minecraft.about.com
- androidgames.about.com
- netforbeginners.about.com
- everydaylinuxuser.com
- google.co.uk
- google.au
- direct.gov.uk
För att hitta alla om .coms kan du bara söka med följande syntax:
grep * om * domännamnOvanstående kommando skulle falla ned om listan innehöll följande namn i det:
- everydaylinuxuser.com/about.html
Du kan därför prova följande syntax:
grep * about.com domännamnDetta skulle fungera okej om det inte fanns en domän med följande namn:
aboutycom.comFör att verkligen söka efter termen about.com skulle du behöva flytta pricken enligt följande:
grep * om .com domännamnDet sista jokerteckenet som visar dig är frågetecknet som står för noll eller ett tecken.
Till exempel:
grep? ber platsnamnOvanstående kommando skulle returnera aberdeen, aberystwyth eller till och med berwick.
Fortsätt läsa nedan
03 av 09Sök efter strängar i början och slutet av raden med grep
Karat (^) och dollar ($) symbolen låter dig söka efter mönster i början och slutet av raderna.
Tänk dig att du har en fil som heter fotboll med följande lagnamn:
- Blackpool
- liverpool
- Manchester City
- Leicester City
- Manchester United
- Newcastle United
- FC United Of Manchester
Om du ville hitta alla lag som började med Manchester skulle du använda följande syntax:
grep ^ Manchester lagOvanstående kommando skulle återvända Manchester City och Manchester United men inte FC United Of Manchester.
Alternativt kan du hitta alla lag som slutar med United med följande syntax:
grep United $ lagKommandot ovan skulle återvända till Manchester United och Newcastle United men inte FC United Of Manchester.
04 av 09Att räkna antalet matcher med grep
Om du inte vill returnera de faktiska raderna som matchar ett mönster med grep men du bara vill veta hur många det finns kan du använda följande syntax:
grep -c mönster inputfilOm mönstret matchades två gånger skulle nummer 2 returneras.
Fortsätt läsa nedan
05 av 09Hitta alla de villkor som inte matchar med grep
Tänk dig att du har en lista med platsnamn med de länder som listas enligt följande:
- Aberdeen Skottland
- glasgow Scotland
- liverpool England
- colwyn bay
- London, England
Du kanske har märkt att colwyn bay inte har något land i samband med det.
För att söka efter alla platser med ett land kan du använda följande syntax:
grep land $ platserResultatet avkastningen skulle vara alla platser utom Colwyn Bay.
Detta verkar helt klart bara för platser som slutar i mark (knappast vetenskapligt).
Du kan invertera valet med följande syntax:
grep -v land $ platserDetta skulle hitta alla platser som inte slutade med mark.
06 av 09Så här hittar du tomma linjer i filer med grep
Tänk dig att du har en inmatningsfil som används av en tredje part som slutar läsa filen när den hittar en tom rad enligt följande:
- aberdeen scotland
- inverness scotland
- liverpool england
- colwyn bay wales
När applikationen kommer till linjen efter liverpool kommer den sluta läsa meningen colwyn bay missas helt.
Du kan använda grep för att söka efter tomma rader med följande syntax:
grep ^ $ platserTyvärr är det inte särskilt användbart eftersom det bara returnerar de tomma linjerna.
Du kan givetvis räkna med antalet tomma linjer som en check för att se om filen är giltig enligt följande:
grep -c ^ $ platserDet skulle dock vara mer användbart att känna till radnummer som har en tom linje så att du kan ersätta dem. Du kan göra det med följande kommando:
grep -n ^ $ platserFortsätt läsa nedan
07 av 09Så här söker du efter strängar med stora eller små bokstäver med grep
Med grep kan du bestämma vilka rader i en fil som har stora bokstäver med följande syntax:
grep 'A-Z' filnamnKorgfästena låter dig bestämma antalet tecken. I ovanstående exempel matchar det alla tecken som ligger mellan A och Z.
För att matcha små bokstäver kan du använda följande syntax:
grep 'a-z' filnamnOm du bara vill matcha bokstäver och inte numerik eller andra symboler kan du använda följande syntax:
grep 'a-zA-Z' filnamnDu kan göra detsamma med siffror enligt följande:
grep '0-9' filnamn 08 av 09Letar efter repeterande mönster med grep
Du kan använda hakparenteser {} för att söka efter ett repeterande mönster.
Tänk dig att du har en fil med telefonnummer enligt följande:
- 055-1234
- 055-4567
- 555-1545
- 444-0167
- 444-0854
- 4549-2234
- x44-1234
Du vet att den första delen av numret måste vara tre siffror och du vill hitta de linjer som inte matchar det här mönstret.
Från föregående exempel vet du att 0-9 returnerar alla nummer i en fil.
I det här fallet vill vi ha linjerna som börjar med tre siffror följt av en bindestreck (-). Du kan göra det med följande syntax:
grep "^ 0-9 0-9 0-9 -" siffrorSom vi vet från tidigare exempel betyder karat (^) att linjen måste börja med följande mönster.
0-9 söker efter ett tal mellan 0 och 9. Eftersom detta ingår tre gånger matchar det 3 nummer. Slutligen finns det en bindestreck för att ange att en bindestreck måste lyckas med de tre siffrorna.
Genom att använda de krökta parenteserna kan du göra sökningen mindre enligt följande:
grep "^ 0-9 {3 } -" nummerSnedstrecket undviker {bracket så att det fungerar som en del av det reguljära uttrycket men i huvudsak vad detta säger är 0-9 {3} vilket betyder ett tal mellan 0 och 9 tre gånger.
De krökta hakarna kan också användas enligt följande:
{5,10}{5,}{5,10} betyder att tecknet som sökes efter måste upprepas minst 5 gånger men inte mer än 10 medan {5,} betyder att tecknet måste upprepas minst 5 gånger, men det kan vara mer än det.
Fortsätt läsa nedan
09 av 09Använda utgången från andra kommandon Använda grep
Hittills har vi tittat på mönster matchning inom enskilda filer, men grep kan använda utmatningen från andra kommandon som inmatning för mönster matchning.
Ett bra exempel på detta använder PS-kommandot som listar aktiva processer.
Till exempel kör följande kommando:
ps -efAlla körprocesser på ditt system visas.
Du kan använda grep för att söka efter en viss körprocess enligt följande:
ps -ef | grep firefoxSammanfattning
Grep-kommandot är ett grundläggande Linux-kommando och det är en som är värt att lära sig, eftersom det kommer att göra ditt liv mycket enklare när du söker efter filer och processer när du använder terminalen.