Android

Grep-kommando i Linux (find tekst i filer)

Pipes, Grep, Sort Commands: Linux Tutorial 9

Pipes, Grep, Sort Commands: Linux Tutorial 9

Indholdsfortegnelse:

Anonim

grep kommandoen, der står for “global regulær ekspressionsprint”, er en af ​​de mest kraftfulde og mest anvendte kommandoer i Linux.

Grep søger efter en eller flere inputfiler efter linjer, der matcher et givet mønster og skriver hver matchende linje til standardoutput. Hvis der ikke er angivet nogen filer, læses grep fra standardindgangen, som normalt er output fra en anden kommando.

I denne tutorial vil vi vise dig, hvordan du bruger grep kommandoen gennem praktiske eksempler og detaljerede forklaringer på de mest almindelige GNU- grep indstillinger.

Grep Command Syntax

Før vi går ind på, hvordan du bruger grep kommandoen, lad os starte med at gennemgå den grundlæggende syntaks.

grep værktøjsudtrykket har følgende form:

grep PATTERN

Elementerne i firkantede parenteser er valgfri.

  • OPTIONS - Nul eller flere indstillinger. Grep giver et antal indstillinger, der kontrollerer dens opførsel. PATTERN - Søgemønster. FILE - Nul eller flere inputfilnavne.

For at kunne søge i filen skal brugeren, der kører kommandoen, have læseadgang til filen.

Sådan bruges grep til at søge efter en streng i filer

Den mest basale brug af grep kommandoen er at søge efter en streng (tekst) i en fil.

For eksempel at vise linjerne fra filen /etc/passwd , der indeholder strengbasen, kan du bruge følgende kommando:

grep bash /etc/passwd

Outputet skal se sådan ud:

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

Hvis strengen indeholder mellemrum, skal du vedlægge den i enkelt eller dobbelt anførselstegn:

grep "Gnome Display Manager" /etc/passwd

Inverter kamp (ekskluder)

For at få vist linjer, der ikke matcher et mønster, skal du bruge indstillingen -v (eller - --invert-match ).

For eksempel for at vise linierne fra filen /etc/passwd , der ikke indeholder strengen nologin , kan du bruge 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

Sådan bruges Grep til at søge efter en streng i kommandoutput

I stedet for at specificere inputfiler, kan du rør output fra en anden kommando til grep og derefter kun vise linjer, der matcher et givet mønster.

For at finde ud af, hvilke processer der kører på dit system som bruger- www-data , kan du f.eks. Bruge 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å kæde flere rør ind på kommandoen. Som du kan se i output ovenfor er der også en linje, der indeholder grep processen. Hvis du ikke ønsker, at den linje skal vises, skal du sende output til en anden 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

Rekursiv søgning

Hvis du vil rekursivt søge efter et mønster, skal du bruge indstillingen -r (eller - --recursive ). Dette vil søge gennem alle filer i det angivne bibliotek og springe over de symlinks, der findes rekursivt. For at følge alle symboliske links skal du bruge indstillingen -R (eller - --dereference-recursive ).

I det følgende eksempel søger vi efter strengen linuxize.com i alle filer i /etc biblioteket:

grep -r linuxize.com /etc

Kommandoen udskriver de matchende linjer, der er præfixeret af den fulde sti 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 bruger du -R option, vil grep følge alle symboliske links:

grep -R linuxize.com /etc

Bemærk den sidste linje i output. Denne linje udskrives ikke i eksemplet ovenfor, fordi filer i Nginx 's sites-enabled bibliotek er symlinks til konfigurationsfiler i det sites-available bibliotek.

/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 kun filnavnet

For at undertrykke standard grep output og kun udskrive navnene på filer, der indeholder det matchede mønster, kan du bruge indstillingen -l (eller --files-with-matches ).

For eksempel at søge gennem alle filer, der slutter med .conf i det aktuelle arbejdsmappe og kun udskrive navnene på filer, der indeholder strengen linuxize.com type:

grep -l linuxize.com *.conf

Outputet ser sådan ud:

tmux.conf haproxy.conf

Indstillingen -l bruges normalt i kombination med den rekursive mulighed -R :

grep -Rl linuxize.com /tmp

Tilfældig følsom søgning

Som standard er grep kommandoen store og små bogstaver. Dette betyder, at store og små bogstaver behandles som adskilte.

For at ignorere sag, når du søger, skal du bruge indstillingen -i (eller --ignore-case ).

For eksempel, når du søger efter Zebra uden nogen mulighed, viser følgende kommando ikke nogen output, dvs. der er matchende linjer:

grep Zebra /usr/share/words

Men hvis du udfører en retssansfølsom søgning ved hjælp af indstillingen -i , matcher den både store og små bogstaver:

grep -i Zebra /usr/share/words

Specificering af "Zebra" vil matche "zebra", "ZEbrA" eller enhver anden kombination af store og små bogstaver for den streng.

zebra zebra's zebras

Søg efter fulde ord

Når du søger efter "gnu", udskriver grep også linjerne, hvor "gnu" er indlejret i større ord, såsom "cygnus" eller "magnum".

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Hvis du kun vil returnere de linjer, hvor den specificerede streng er et helt ord (lukket af tegn, der ikke er ord), skal du bruge indstillingen -w (eller --word-regexp ).

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

grep -w gnu /usr/share/words

gnu

Vis linienumre

For at vise antallet af linjer, der indeholder en streng, der matcher et mønster, skal du bruge indstillingen -n (eller - --line-number ). Når du bruger denne indstilling, udskriver grep kampe til standardudgang, der er præfikseret med det linjenummer, det blev fundet på.

For eksempel for at få vist linjerne fra filen /etc/services , der indeholder strengbash, der er præfixeret med det matchende linjenummer, kan du bruge følgende kommando:

grep -n 10000 /etc/services

Outputet nedenfor viser os, at kampene findes på linjerne 10423 og 10424.

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

Tællekampe

Hvis du vil udskrive et antal matchende linjer til standardoutput, skal du bruge indstillingen -c (eller - --count ).

I eksemplet nedenfor tæller vi antallet af konti, der har /usr/bin/zsh som et shell.

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

4

Søg efter flere strenge (mønstre)

To eller flere søgemønstre kan forbindes ved hjælp af OR-operatøren | .

Som standard fortolker grep mønsteret som et grundlæggende regulært udtryk, hvor metategnene som | mister deres specielle betydning, og deres tilbagestående versioner skal bruges.

I eksemplet nedenfor søger vi efter alle forekomster af ordene fatal , error og critical i Nginx-logfejlfilen:

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

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

Stille tilstand

Den -q (eller - --quiet ) fortæller grep at ikke skrive noget til terminalen (standardoutput). Hvis der findes en kamp, ​​afsluttes kommandoen med status 0 . Dette er nyttigt, når du bruger grep i shell-scripts, hvor du vil kontrollere, om en fil indeholder en streng og udføre en bestemt handling afhængigt af resultatet.

Her er et eksempel på at bruge grep i en stille tilstand som en testkommando i en if sætning:

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

Grundlæggende regelmæssig ekspression

GNU Grep har to regulære ekspressionsfunktionssæt, Basic og Extended. Som standard fortolker grep mønsteret som et grundlæggende regulært udtryk.

Når de bruges i grundlæggende regulært udtrykstilstand, er alle andre tegn undtagen metategnene faktisk regulære udtryk, der matcher sig selv. Nedenfor er en liste over mest almindeligt anvendte metategn:

  • Brug symbolet ^ (caret) til at matche udtryk i starten af ​​en linje. I det følgende eksempel stemmer strengen ^kangaroo kun, hvis den forekommer i starten af ​​en linje.

    grep "^kangaroo" file.txt

    Brug symbolet $ (dollar) til at matche udtryk i slutningen af ​​en linje. I det følgende eksempel stemmer strengstrengen kangaroo$ kun, hvis den forekommer helt i slutningen af ​​en linje.

    grep "kangaroo$" file.txt

    Brug . (periode) symbol, der matcher ethvert enkelt tegn. For at matche alt, der begynder med kan så har to tegn og slutter med roo , kan du bruge følgende mønster:

    grep "kan..roo" file.txt

    Brug (parentes) for at matche ethvert enkelt tegn, der er lukket i parenteserne. Find for eksempel linjerne, der indeholder accept eller “ accent , du kan bruge følgende mønster:

    grep "accet" file.txt

    Brug (parentes) for at matche ethvert enkelt tegn, der er lukket i parenteserne. Det følgende mønster matcher enhver kombination af strenge, der indeholder co(any_letter_except_l)a , såsom coca , cobalt og så videre, men vil ikke matche linjerne, der indeholder cola , grep "coa" file.txt

For at undslippe den specielle betydning af det næste tegn, skal du bruge symbolet \ (skråstreg).

Udvidede regelmæssige udtryk

For at fortolke mønsteret som et udvidet regulært udtryk skal du bruge indstillingen -E (eller - --extended-regexp ). Udvidede regulære udtryk inkluderer alle de grundlæggende metategn sammen med yderligere metategn for at skabe mere komplekse og kraftfulde søgemønstre. Nedenfor er nogle eksempler:

  • Match og udpak alle e-mail-adresser fra en given fil:

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

    Match og udpak alle gyldige IP-adresser fra en given fil:

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

Indstillingen -o bruges til kun at udskrive den matchende streng.

Udskriv linjer før en kamp

Hvis du vil udskrive et specifikt antal linjer før matchende linjer, skal du bruge indstillingen -B (eller - --before-context ).

For eksempel at vise fem linjer med førende kontekst før matchende linjer, bruger du følgende kommando:

grep -B 5 root /etc/passwd

Udskriv linjer efter en kamp

Hvis du vil udskrive et specifikt antal linjer efter matchende linjer, skal du bruge indstillingen -A (eller --after-context ).

For eksempel for at få vist fem linjer med efterfølgende kontekst efter matchende linjer, ville du bruge følgende kommando:

grep -A 5 root /etc/passwd

Konklusion

grep kommandoen giver dig mulighed for at søge efter et mønster inde i filer. Hvis en match findes, udskriver grep linjerne, der indeholder det specificerede mønster.

Der er meget mere at lære om Grep på siden Grep Brugermanual.

grep terminal