Android

Grep-kommando i Linux (hitta text i filer)

Linux/Mac Terminal Tutorial: The Grep Command - Search Files and Directories for Patterns of Text

Linux/Mac Terminal Tutorial: The Grep Command - Search Files and Directories for Patterns of Text

Innehållsförteckning:

Anonim

grep kommandot som står för “global reguljära uttryckstryck” är ett av de kraftfullaste och mest använda kommandona i Linux.

Grep söker i en eller flera inmatningsfiler efter rader som matchar ett givet mönster och skriver varje matchande rad till standardutdata. Om inga filer anges läser grep från standardingången, som vanligtvis är utgången från ett annat kommando.

I den här tutorialen visar vi dig hur du använder grep kommandot genom praktiska exempel och detaljerade förklaringar av de vanligaste GNU grep alternativen.

Grep Command Syntax

Innan vi går in på hur du använder grep kommandot, låt oss börja med att granska grundsyntaxen.

Uttryck av grep verktyg har följande form:

grep PATTERN

Objekten i fyrkantiga parenteser är valfria.

  • OPTIONS - Noll eller fler alternativ. Grep tillhandahåller ett antal alternativ som styr dess beteende. PATTERN - PATTERN . FILE - Noll eller fler inmatningsfilnamn.

För att kunna söka i filen måste användaren som kör kommandot ha läsåtkomst till filen.

Hur man använder grep att söka efter en sträng i filer

Den mest grundläggande användningen av grep kommandot är att söka efter en sträng (text) i en fil.

För att exempelvis visa raderna från /etc/passwd innehåller strängbash kan du använda följande kommando:

grep bash /etc/passwd

Utgången ska se ut så här:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Om strängen innehåller mellanslag måste du bifoga den i enstaka eller dubbla citattecken:

grep "Gnome Display Manager" /etc/passwd

Invertera match (uteslut)

Om du vill visa rader som inte matchar ett mönster använder du alternativet --invert-match (eller - --invert-match ).

Till exempel för att visa raderna från /etc/passwd som inte innehåller strängen nologin du använda följande kommando:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Hur man använder Grep för att söka efter en sträng i kommandoutput

I stället för att ange inmatningsfiler kan du leda utdata från ett annat kommando till grep och sedan bara visa rader som matchar ett givet mönster.

För att ta reda på vilka processer som körs på ditt system som www-data du använda följande ps kommando:

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Du kan också kedja flera rör på kommandot. Som du ser i utgången ovan finns det också en rad som innehåller grep processen. Om du inte vill att den raden ska visas skicka utdata till en annan grep instans som visas nedan.

ps -ef | grep www-data | grep -v grep

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Rekursiv sökning

För att rekursivt söka efter ett mönster använder du, använd alternativet -r (eller - --recursive ). Detta kommer att söka igenom alla filer i den angivna katalogen och hoppa över symlänkar som stöds rekursivt. För att följa alla symboliska länkar använder du -R alternativet (eller - --dereference-recursive ).

I följande exempel söker vi efter strängen linuxize.com i alla filer i katalogen /etc :

grep -r linuxize.com /etc

Kommandot kommer att skriva ut de matchande raderna som är förinställda av hela sökvägen till filen.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

Om istället -r använder du -R alternativet följer grep alla symboliska länkar:

grep -R linuxize.com /etc

Lägg märke till den sista raden i utgången. Den raden skrivs inte ut i exemplet ovan eftersom filer i Nginxs sites-enabled katalog är symlänkar till konfigurationsfiler i den plats sites-available katalogen.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

Visa bara filnamnet

För att undertrycka standardutgången för grep och bara skriva ut namnen på filer som innehåller det matchade mönstret kan du använda alternativet -l (eller - --files-with-matches ).

Till exempel för att söka igenom alla filer som slutar med .conf i den aktuella arbetskatalogen och bara skriva ut namnen på filer som innehåller strängen linuxize.com typ:

grep -l linuxize.com *.conf

Utgången ser ut så här:

tmux.conf haproxy.conf

Alternativet -l används vanligtvis i kombination med det rekursiva alternativet -R :

grep -Rl linuxize.com /tmp

Skydd mot okänslig sökning

Som standard är grep kommandot skiftlägeskänslig. Detta betyder att versaler och gemener behandlas som distinkta.

För att ignorera fall när du söker använder du alternativet -i (eller --ignore-case ).

Till exempel när du söker efter Zebra utan något alternativ kommer följande kommando inte att visa någon utgång, dvs. det finns matchande rader:

grep Zebra /usr/share/words

Men om du utför en okänslig sökning med hjälp av alternativet -i kommer det att matcha både versaler och gemener:

grep -i Zebra /usr/share/words

Att ange “Zebra” kommer att matcha “zebra”, “ZEbrA” eller någon annan kombination av stora och små bokstäver för den strängen.

zebra zebra's zebras

Sök efter fullständiga ord

När du söker efter "gnu" kommer grep också att skriva ut raderna där "gnu" är inbäddat i större ord, till exempel "cygnus" eller "magnum".

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

För att bara returnera de rader där den angivna strängen är ett helt ord (omslutet av tecken som inte är ord) använder du alternativet --word-regexp (eller --word-regexp ).

Ordetecken inkluderar alfanumeriska tecken ( az , AZ och 0-9 ) och understreck ( _ ). Alla andra tecken betraktas som icke-ordtecken.

grep -w gnu /usr/share/words

gnu

Visa radnummer

För att visa antalet rader som innehåller en sträng som matchar ett mönster använder du alternativet -n (eller - --line-number ). När du använder det här alternativet kommer grep att skriva ut matchningarna till standardutmatningen förinställd med radnumret som den hittades på.

Till exempel för att visa raderna från /etc/services innehåller strängbash bash med det matchande radnumret kan du använda följande kommando:

grep -n 10000 /etc/services

Utgången nedan visar oss att matchningarna finns på linjerna 10423 och 10424.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

Räkna matcher

Om du vill skriva ut ett antal matchande rader till standardutmatningen använder --count alternativet -c (eller - --count ).

I exemplet nedan räknar vi antalet konton som har /usr/bin/zsh som ett skal.

grep -c '/usr/bin/zsh' /etc/passwd

4

Sök efter flera strängar (mönster)

Två eller flera sökmönster kan förenas med OR-operatören | .

Som standard tolkar grep mönstret som ett grundläggande regelbundet uttryck där metatecken som | förlorar sin speciella betydelse, och deras backslash versioner måste användas.

I exemplet nedan söker vi efter alla förekomster av orden fatal , error och critical i Nginx-loggfilsfilen:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Tyst läge

-q (eller - --quiet ) berättar för grep att inte skriva något till terminalen (standardutgång). Om en matchning hittas kommer kommandot att avsluta med status 0 . Detta är användbart när du använder grep i skalskript där du vill kontrollera om en fil innehåller en sträng och utföra en viss åtgärd beroende på resultatet.

Här är ett exempel på att använda grep i ett tyst läge som ett testkommando i ett if uttalande:

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

Grundläggande regelbundet uttryck

GNU Grep har två regelbundna uttrycksfunktionsuppsättningar, Basic och Extended. Som standard tolkar grep mönstret som ett grundläggande reguljärt uttryck.

När de används i grundläggande reguljärt uttrycksläge är alla andra tecken utom metatecken faktiskt vanliga uttryck som matchar sig själva. Nedan finns en lista över de mest använda metatecken:

  • Använd symbolen ^ (caret) för att matcha uttrycket i början av en rad. I följande exempel kommer strängen ^kangaroo att matcha endast om den inträffar i början av en rad.

    grep "^kangaroo" file.txt

    Använd symbolen $ (dollar) för att matcha uttrycket i slutet av en rad. I följande exempel matchar strängen kangaroo$ endast om den inträffar i slutet av en rad.

    grep "kangaroo$" file.txt

    Använd . (period) symbol för att matcha varje enskilt tecken. Till exempel, för att matcha allt som börjar med kan då har två tecken och slutar med strängen roo , kan du använda följande mönster:

    grep "kan..roo" file.txt

    Använda sig av (parentes) för att matcha varje enskilt tecken som ligger i parenteserna. Hitta till exempel raderna som innehåller accept eller " accent Du kan använda följande mönster:

    grep "accet" file.txt

    Använda sig av (parentes) för att matcha varje enskilt tecken som ligger i parenteserna. Följande mönster kommer att matcha alla kombinationer av strängar som innehåller co(any_letter_except_l)a , såsom coca , cobalt och så vidare, men kommer inte att matcha raderna som innehåller cola , grep "coa" file.txt

För att undgå den speciella betydelsen av nästa tecken, använd symbolen \ (backslash).

Utökade regelbundna uttryck

För att tolka mönstret som ett utökat regelbundet uttryck använder du alternativet -E (eller - --extended-regexp ). Utökade regelbundna uttryck inkluderar alla grundläggande metatecken, tillsammans med ytterligare metatecken för att skapa mer komplexa och kraftfulla sökmönster. Nedan följer några exempel:

  • Matcha och extrahera alla e-postadresser från en given fil:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Matcha och extrahera alla giltiga IP-adresser från en given fil:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

Alternativet -o används för att bara skriva ut den matchande strängen.

Skriv ut linjer före en match

Om du vill skriva ut ett visst antal rader innan du matchar rader använder du alternativet -B (eller - --before-context ).

Om du till exempel vill visa fem rader med ledande sammanhang innan du matchar rader använder du följande kommando:

grep -B 5 root /etc/passwd

Skriv ut linjer efter en match

Om du vill skriva ut ett visst antal rader efter matchande rader använder du alternativet -A (eller --after-context ).

Till exempel för att visa fem rader med efterföljande sammanhang efter matchande rader, använder du följande kommando:

grep -A 5 root /etc/passwd

Slutsats

Med grep kommandot kan du söka efter ett mönster inuti filer. Om en matchning hittas kommer grep att skriva ut raderna som innehåller det angivna mönstret.

Det finns mycket mer att lära sig om Grep på sidan Grep Användarmanual.

grep terminal