Slik bruker du grep-kommandoen på Linux

Linux grep-kommandoen er et streng- og mønstertilpasningsverktøy som viser samsvarende linjer fra flere filer. Det fungerer også med pipeutgang fra andre kommandoer. Vi viser deg hvordan.

Historien bak grep

grep-kommandoen er kjent i Linux og Unix sirkler av tre grunner. For det første er det enormt nyttig. For det andre et vell av alternativer kan være overveldende. For det tredje ble den skrevet over natten for å tilfredsstille et spesielt behov. De to første er bang på; den tredje er litt av.

Ken Thompson hadde trukket ut søkefunksjonene for regulære uttrykk fra ed-editoren (uttales ee-dee) og laget et lite program – til eget bruk – for å søke gjennom tekstfiler. Hans avdelingsleder kl Bell Labs, Doug Mcilroyhenvendte seg til Thompson og beskrev problemet en av kollegene hans, Lee McMahonsto overfor.

McMahon prøvde å identifisere forfatterne av Federalistiske papirer gjennom tekstanalyse. Han trengte et verktøy som kunne søke etter fraser og strenger i tekstfiler. Thompson brukte omtrent en time den kvelden på å gjøre verktøyet sitt til et generelt verktøy som kunne brukes av andre og omdøpte det til grep. Han tok navnet fra ed-kommandostrengen g/re/p , som oversettes som «globalt regulært uttrykkssøk.»

Du kan se Thompson snakke til Brian Kernighan om fødselen til grep.

Enkle søk med grep

For å søke etter en streng i en fil, send søkeordet og filnavnet på kommandolinjen:

Matchende linjer vises. I dette tilfellet er det en enkelt linje. Den samsvarende teksten er uthevet. Dette er fordi på de fleste distribusjoner er grep aliasert til:

alias grep='grep --colour=auto'

La oss se på resultater der det er flere linjer som samsvarer. Vi ser etter ordet «Gjennomsnitt» i en programloggfil. Fordi vi ikke kan huske om ordet er med små bokstaver i loggfilen, bruker vi alternativet -i (ignorer store og små bokstaver):

grep -i Average geek-1.log

Hver samsvarende linje vises, med den samsvarende teksten uthevet i hver linje.

Vi kan vise linjene som ikke samsvarer ved å bruke alternativet -v (invert match).

grep -v Mem geek-1.log

Det er ingen utheving fordi disse er linjene som ikke samsvarer.

  Hvordan installere JetBrains DataGrip på Linux

Vi kan få grep til å være helt stille. Resultatet sendes til skallet som en returverdi fra grep. Et resultat på null betyr at strengen ble funnet, og et resultat på ett betyr at den ikke ble funnet. Vi kan sjekke returkoden ved å bruke $? spesielle parametere:

grep -q average geek-1.log
echo $?
grep -q wdzwdz geek-1.log
echo $?

Rekursive søk med grep

For å søke gjennom nestede kataloger og underkataloger, bruk alternativet -r (rekursivt). Merk at du ikke oppgir et filnavn på kommandolinjen, du må oppgi en bane. Her søker vi i gjeldende katalog «.» og eventuelle underkataloger:

grep -r -i memfree .

Utdataene inkluderer katalogen og filnavnet til hver samsvarende linje.

Vi kan få grep til å følge symbolske lenker ved å bruke alternativet -R (rekursiv dereference). Vi har en symbolsk lenke i denne katalogen, kalt logs-folder. Den peker på /home/dave/logs.

ls -l logs-folder

La oss gjenta vårt siste søk med alternativet -R (rekursiv dereference):

grep -R -i memfree .

Den symbolske lenken følges og katalogen den peker til søkes også av grep.

Søker etter hele ord

Som standard vil grep samsvare med en linje hvis søkemålet vises hvor som helst på den linjen, inkludert inne i en annen streng. Se på dette eksemplet. Vi skal søke etter ordet «gratis».

grep -i free geek-1.log

Resultatene er linjer som har strengen «fri» i seg, men de er ikke separate ord. De er en del av strengen «MemFree.»

For å tvinge grep til bare å matche separate «ord», bruk alternativet -w (ordreguttrykk).

grep -w -i free geek-1.log
echo $?

Denne gangen er det ingen resultater fordi søkeordet «gratis» ikke vises i filen som et eget ord.

Bruke flere søkeord

Alternativet -E (utvidet regexp) lar deg søke etter flere ord. (alternativet -E erstatter det utdaterte egrep-versjon av grep.)

Denne kommandoen søker etter to søkeord, «gjennomsnittlig» og «memfree».

grep -E -w -i "average|memfree" geek-1.log

grep -E -w -i

Alle de samsvarende linjene vises for hvert av søkeordene.

Utdata fra grep -E -w -i

Du kan også søke etter flere termer som ikke nødvendigvis er hele ord, men de kan også være hele ord.

Alternativet -e (mønstre) lar deg bruke flere søkeord på kommandolinjen. Vi bruker funksjonen for regulære uttrykk for å lage et søkemønster. Det forteller grep å matche et hvilket som helst av tegnene innenfor parentes «[].» Dette betyr at grep vil matche enten «kB» eller «KB» mens den søker.

Begge strengene er matchet, og faktisk inneholder noen linjer begge strengene.

Matchende linjer nøyaktig

-x (linjeregexp) vil bare samsvare med linjer der hele linjen samsvarer med søkeordet. La oss søke etter et dato- og tidsstempel som vi vet vises bare én gang i loggfilen:

grep -x "20-Jan--06 15:24:35" geek-1.log

grep -x

Enkeltlinjen som samsvarer, blir funnet og vist.

  Hvordan lese Hacker News på Linux-skrivebordet

Det motsatte av det er bare å vise linjene som ikke samsvarer. Dette kan være nyttig når du ser på konfigurasjonsfiler. Kommentarer er flotte, men noen ganger er det vanskelig å finne de faktiske innstillingene blant dem alle. Her er filen /etc/sudoers:

Vi kan effektivt filtrere ut kommentarlinjene slik:

sudo grep -v "https://www.wdzwdz.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers

sudo grep -v

Det er mye lettere å analysere.

Viser bare samsvarende tekst

Det kan være en anledning når du ikke vil se hele den matchende linjen, bare den matchende teksten. Alternativet -o (bare matchende) gjør nettopp det.

grep -o MemFree geek-1.log

Visningen reduseres til å vise bare teksten som samsvarer med søkeordet, i stedet for hele den samsvarende linjen.

Teller med grep

grep handler ikke bare om tekst, det kan også gi numerisk informasjon. Vi kan få grep til å telle for oss på forskjellige måter. Hvis vi vil vite hvor mange ganger et søkeord vises i en fil, kan vi bruke alternativet -c (count).

grep -c average geek-1.log

grep rapporterer at søkeordet vises 240 ganger i denne filen.

Du kan få grep til å vise linjenummeret for hver samsvarende linje ved å bruke alternativet -n (linjenummer).

grep -n Jan geek-1.log

Linjenummeret for hver samsvarende linje vises på begynnelsen av linjen.

For å redusere antall resultater som vises, bruk alternativet -m (maksimalt antall). Vi skal begrense utgangen til fem samsvarende linjer:

grep -m5 -n Jan geek-1.log

Legger til kontekst

Å kunne se noen ekstra linjer – muligens ikke-matchende linjer – for hver samsvarende linje er ofte nyttig. det kan hjelpe deg med å skille ut hvilke av de matchede linjene som er de du er interessert i.

For å vise noen linjer etter den samsvarende linjen, bruk alternativet -A (etter kontekst). Vi ber om tre linjer i dette eksemplet:

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -A 3 -x

For å se noen linjer fra før den samsvarende linjen, bruk alternativet -B (kontekst før).

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -B 3 -x

Og for å inkludere linjer fra før og etter den samsvarende linjen, bruk alternativet -C (kontekst).

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

grep -C 3 -x

Viser samsvarende filer

For å se navnene på filene som inneholder søkeordet, bruk alternativet -l (filer med samsvar). For å finne ut hvilke C-kildekodefiler som inneholder referanser til sl.h-headerfilen, bruk denne kommandoen:

grep -l "sl.h" *.c

grep -l

Filnavnene er oppført, ikke de samsvarende linjene.

  Hvordan spille Dead Rising 2 på Linux

Utgang fra grep -l

Og selvfølgelig kan vi se etter filer som ikke inneholder søkeordet. Alternativet -L (filer uten samsvar) gjør nettopp det.

grep -L "sl.h" *.c

grep -L

Start og slutt på linjer

Vi kan tvinge grep til å bare vise treff som enten er på starten eller slutten av en linje. Operatoren «^» for regulære uttrykk samsvarer med starten på en linje. Praktisk talt alle linjene i loggfilen vil inneholde mellomrom, men vi skal søke etter linjer som har et mellomrom som sitt første tegn:

grep "^ " geek-1.log

grep

Linjene som har et mellomrom som det første tegnet – ved starten av linjen – vises.

Utgang grep

For å matche slutten av linjen, bruk «$» regulære uttrykksoperator. Vi skal søke etter linjer som slutter med «00».

grep "00$" geek-1.log

grep

Displayet viser linjene som har «00» som siste tegn.

utgang av grep

Bruke Pipes med grep

Selvfølgelig kan du pipe input til grep , pipe output fra grep inn i et annet program, og ha grep plassert i midten av en rørkjede.

La oss si at vi ønsker å se alle forekomster av strengen «ExtractParameters» i C-kildekodefilene våre. Vi vet at det kommer til å bli ganske mange, så vi overfører utdataene til mindre:

grep "ExtractParameters" *.c | less

grep

Utgangen presenteres i mindre.

Utdata fra grep

Dette lar deg bla gjennom filoppføringen og bruke lesss søkefunksjon.

Hvis vi piper utdataene fra grep inn i wc og bruker alternativet -l (linjer), vil vi kan telle antall linjer i kildekodefilene som inneholder «ExtractParameters». (Vi kunne oppnå dette ved å bruke alternativet grep -c (count), men dette er en fin måte å demonstrere pipe-out av grep.)

grep "ExtractParameters" *.c | wc -l

grep

Med den neste kommandoen overfører vi utdataene fra ls til grep og overfører utdataene fra grep til sort . Vi viser filene i gjeldende katalog, og velger de med strengen «Aug» i dem, og sortere dem etter filstørrelse:

ls -l | grep "Aug" | sort +4n

ls -l |  grep

La oss bryte det ned:

ls -l: Utfør en langformatliste over filene ved å bruke ls.
grep «Aug»: Velg linjene fra ls-oppføringen som har «Aug» i seg. Merk at dette også vil finne filer som har «Aug» i navnet.
sort +4n: Sorter utdataene fra grep i den fjerde kolonnen (filstørrelse).

Vi får en sortert liste over alle filene som er endret i august (uavhengig av år), i stigende rekkefølge etter filstørrelse.

grep: Mindre en kommando, mer av en alliert

grep er et fantastisk verktøy å ha til disposisjon. Den er fra 1974 og er fortsatt sterk fordi vi trenger det den gjør, og ingenting gjør den bedre.

Å koble grep med noen regulære uttrykk – fu tar det virkelig til neste nivå.