Android

Grep-kommando i Linux (finn tekst 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

Innholdsfortegnelse:

Anonim

grep kommandoen som står for “global regulary expression print” er en av de kraftigste og mest brukte kommandoene i Linux.

Grep søker i en eller flere inndatafiler etter linjer som samsvarer med et gitt mønster og skriver hver matchende linje til standardutdata. Hvis ingen filer er spesifisert, leser grep fra standardinngangen, som vanligvis er utdataene fra en annen kommando.

I denne opplæringen vil vi vise deg hvordan du bruker grep kommandoen gjennom praktiske eksempler og detaljerte forklaringer på de vanligste GNU grep alternativene.

Grep Command Syntax

Før vi går inn på hvordan du bruker grep kommandoen, la oss begynne med å gå gjennom den grunnleggende syntaks.

grep har følgende form:

grep PATTERN

Elementene i firkantede parenteser er valgfrie.

  • OPTIONS - Null eller flere alternativer. Grep gir en rekke alternativer som kontrollerer atferden. PATTERN - Søkemønster. FILE - Null eller flere inndatafiler.

For å kunne søke i filen, må brukeren som kjører kommandoen, ha lesetilgang til filen.

Slik bruker du grep å søke etter en streng i filer

Den mest grunnleggende bruken av grep kommandoen er å søke etter en streng (tekst) i en fil.

For å vise linjene fra /etc/passwd filen som inneholder strengen bash , kan du for eksempel bruke følgende kommando:

grep bash /etc/passwd

Utgangen skal se slik ut:

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

Hvis strengen inneholder mellomrom, må du legge den inn i enkelt eller dobbelt anførselstegn:

grep "Gnome Display Manager" /etc/passwd

Inverter kamp (ekskluder)

Hvis du vil vise linjene som ikke samsvarer med et mønster, bruker du alternativet -v (eller - --invert-match ).

For å vise linjene fra /etc/passwd filen som ikke inneholder strengen nologin , kan du for eksempel bruke følgende 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

Hvordan bruke Grep til å søke etter en streng i kommandoutdata

I stedet for å spesifisere inndatafiler, kan du pipe utdataene fra en annen kommando til grep , og deretter bare vise linjer som samsvarer med et gitt mønster.

For å finne ut hvilke prosesser som kjøres på systemet ditt som bruker- www-data , kan du for eksempel bruke følgende 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 også lenke inn flere rør på kommandoen. Som du ser i utdataene over er det også en linje som inneholder grep prosessen. Hvis du ikke vil at linjen skal vises, passerer du utdataene til en annen grep forekomst som vist nedenfor.

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

Rekursivt søk

For å rekursivt søke etter et mønster, bruk alternativet -r (eller - --recursive ). Dette vil søke gjennom alle filene i den angitte katalogen, og hoppe over symlinkene som oppstår rekursivt. For å følge alle symbolske lenker, bruk alternativet -R (eller - --dereference-recursive ).

I det følgende eksemplet søker vi etter strengen linuxize.com i alle filer i /etc katalogen:

grep -r linuxize.com /etc

Kommandoen vil skrive ut de samsvarende linjene forhåndsinnstilt av hele banen til filen.

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

Hvis i stedet -r du bruker -R alternativet, vil grep følge alle symbolske lenker:

grep -R linuxize.com /etc

Legg merke til den siste linjen i utgangen. Denne linjen er ikke skrevet ut i eksemplet ovenfor fordi filer i Nginx 'kataloger som er sites-enabled for sites-enabled er symlinker til konfigurasjonsfiler i katalogen som er sites-available .

/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;

Vis bare filnavnet

For å undertrykke standard grep utdata og skrive ut bare navnene på filer som inneholder det matchede mønsteret, kan du bruke alternativet -l (eller --files-with-matches ).

For eksempel å søke gjennom alle filer som slutter med .conf i den gjeldende arbeidskatalogen og bare skrive ut navnene på filer som inneholder strengen linuxize.com type:

grep -l linuxize.com *.conf

Utgangen vil se slik ut:

tmux.conf haproxy.conf

Alternativet -l brukes vanligvis i kombinasjon med det rekursive alternativet -R :

grep -Rl linuxize.com /tmp

Utilpasset søk

Som standard er grep kommandoen store og små bokstaver. Dette betyr at store og små bokstaver blir behandlet som forskjellige.

For å ignorere sak når du søker, bruk alternativet -i (eller --ignore-case ).

For eksempel, når du søker etter Zebra uten noe alternativ, vil følgende kommando ikke vise noen utdata, dvs. det er samsvarende linjer:

grep Zebra /usr/share/words

Men hvis du utfører et tilfelle ufølsomt søk ved å bruke alternativet -i , vil det samsvare med store og små bokstaver:

grep -i Zebra /usr/share/words

Å spesifisere “Zebra” vil samsvare med “zebra”, “ZEbrA” eller hvilken som helst annen kombinasjon av store og små bokstaver for den strengen.

zebra zebra's zebras

Søk etter fulle ord

Når du søker etter “gnu”, vil grep også skrive ut linjene der “gnu” er innebygd i større ord, for eksempel “cygnus” eller “magnum”.

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Hvis du bare vil returnere de linjene der den angitte strengen er et helt ord (lukket av ikke- --word-regexp ), bruker du alternativet -w (eller --word-regexp ).

Ordtegn inkluderer alfanumeriske tegn ( az , AZ og 0-9 ) og understrekinger ( _ ). Alle andre tegn regnes som ikke-ordtegn.

grep -w gnu /usr/share/words

gnu

Vis linjenumre

Hvis du vil vise antall linjer som inneholder en streng som samsvarer med et mønster, bruker du alternativet -n (eller - --line-number ). Når du bruker dette alternativet, vil grep skrive ut fyrstikkene til standardutdata forhåndsinnstilt med linjenummeret den ble funnet på.

For å vise linjene fra filen /etc/services som inneholder strengen bash prefiks med det samsvarende linjenummeret, kan du for eksempel bruke følgende kommando:

grep -n 10000 /etc/services

Utgangen nedenfor viser oss at fyrstikkene er funnet på linjene 10423 og 10424.

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

Telle kamper

Hvis du vil skrive ut et antall samsvarende linjer til standardutdata, bruker du alternativet -c (eller - --count ).

I eksemplet nedenfor teller vi antall kontoer som har /usr/bin/zsh som et skall.

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

4

Søk etter flere strenger (mønstre)

To eller flere søkemønstre kan kobles sammen med OR-operatøren | .

Som standard tolker grep mønsteret som et grunnleggende vanlig uttrykk der metategnene som | mister sin spesielle mening, og deres tilbakeskrittede versjoner må brukes.

I eksemplet nedenfor søker vi etter alle forekomster av ordene fatal , error og critical i Nginx-loggfeilfilen:

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

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

Stillemodus

Den -q (eller - --quiet ) forteller grep om ikke å skrive noe til terminalen (standardutgang). Hvis en kamp blir funnet, vil kommandoen avslutte med status 0 . Dette er nyttig når du bruker grep i skallskript der du vil sjekke om en fil inneholder en streng og utføre en viss handling avhengig av resultatet.

Her er et eksempel på å bruke grep i en stille modus som en testkommando i en if setning:

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

Grunnleggende uttrykk

GNU Grep har to vanlige uttrykksfunksjonssett, Basic og Extended. Som standard tolker grep mønsteret som et grunnleggende vanlig uttrykk.

Når de brukes i grunnleggende regulære uttrykksmodus, er alle andre tegn bortsett fra metategnene, vanlige uttrykk som matcher seg selv. Nedenfor er en liste over de mest brukte metategnene:

  • Bruk ^ (caret) -symbolet for å matche uttrykk i begynnelsen av en linje. I det følgende eksemplet vil strengen ^kangaroo samsvare bare hvis den forekommer helt på begynnelsen av en linje.

    grep "^kangaroo" file.txt

    Bruk symbolet $ (dollar) for å matche uttrykk på slutten av en linje. I det følgende eksemplet vil strengen kangaroo$ samsvare bare hvis den forekommer helt på slutten av en linje.

    grep "kangaroo$" file.txt

    Bruk . (periode) symbol for å matche ethvert enkelt tegn. For å matche alt som begynner med kan så har to tegn og slutter med streng- roo , kan du bruke følgende mønster:

    grep "kan..roo" file.txt

    Bruk (parentes) for å matche ethvert enkelt tegn som er lukket i parentesene. Finn for eksempel linjene som inneholder accept eller " accent , du kan bruke følgende mønster:

    grep "accet" file.txt

    Bruk (parentes) for å matche ethvert enkelt tegn som er lukket i parentesene. Følgende mønster vil samsvare med alle kombinasjoner av strenger som inneholder co(any_letter_except_l)a , for eksempel coca , cobalt og så videre, men vil ikke samsvare med linjene som inneholder cola , grep "coa" file.txt

For å unnslippe den spesielle betydningen av neste karakter, bruk symbolet \ (skråstrek).

Utvidede vanlige uttrykk

Hvis du vil tolke mønsteret som et utvidet vanlig uttrykk, bruker du alternativet -E (eller --extended-regexp ). Utvidede vanlige uttrykk inkluderer alle de grunnleggende metategnene, sammen med ekstra metategn for å lage mer komplekse og kraftige søkemønstre. Nedenfor er noen eksempler:

  • Match og trekk ut alle e-postadressene fra en gitt fil:

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

    Match og trekk ut alle gyldige IP-adresser fra en gitt fil:

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

Alternativet -o brukes til å skrive ut bare den matchende strengen.

Skriv ut linjer før en kamp

Hvis du vil skrive ut et bestemt antall linjer før samsvarende linjer, bruker du alternativet -B (eller - --before-context ).

For å vise fem linjer med kontekst før samsvarende linjer, bruker du for eksempel følgende kommando:

grep -B 5 root /etc/passwd

Skriv ut linjer etter en kamp

Hvis du vil skrive ut et bestemt antall linjer etter samsvarende linjer, bruker du alternativet -A (eller --after-context ).

For å vise fem linjer med etterfølgende kontekst etter samsvarende linjer, bruker du følgende kommando:

grep -A 5 root /etc/passwd

Konklusjon

grep kommandoen lar deg søke etter et mønster i filene. Hvis en kamp hvis funnet, vil grep skrive ut linjene som inneholder det spesifiserte mønsteret.

Det er mye mer å lære om Grep på siden Grep Brukerhåndbok.

grep terminal