Sådan bruges grep-kommandoen på Linux

Linux- grepkommandoen er et streng- og mønstermatchværktøj, der viser matchende linjer fra flere filer. Det fungerer også med piped output fra andre kommandoer. Vi viser dig hvordan.

Historien bag grep

Den grepkommando er berømt i Linux og Unix cirkler af tre grunde. For det første er det enormt nyttigt. For det andet kan et væld af muligheder være overvældende. For det tredje blev det skrevet natten over for at tilfredsstille et bestemt behov. De første to er knall på; den tredje er lidt slukket.

Ken Thompson havde udvundet søgefunktionerne til regulære udtryk fra edredaktøren (udtalt ee-dee) og skabt et lille program - til eget brug - til at søge gennem tekstfiler. Hans afdelingsleder hos Bell Labs, Doug Mcilroy, henvendte sig til Thompson og beskrev problemet, som en af ​​hans kolleger, Lee McMahon, stod overfor.

McMahon forsøgte at identificere forfatterne til føderalistiske papirer gennem tekstanalyse. Han havde brug for et værktøj, der kunne søge efter sætninger og strenge i tekstfiler. Thompson tilbragte cirka en time den aften med at gøre sit værktøj til et generelt værktøj, der kunne bruges af andre og omdøbte det til grep. Han tog navnet fra edkommandostrengen g/re/p, der oversættes som "global søgning efter regulært udtryk."

Du kan se Thompson tale med Brian Kernighan om fødslen af grep.

Enkle søgninger med grep

For at søge efter en streng i en fil skal du sende søgeudtrykket og filnavnet på kommandolinjen:

Matchende linjer vises. I dette tilfælde er det en enkelt linje. Den matchende tekst er fremhævet. Dette skyldes, at de fleste distributioner greper alias for:

alias grep = "grep --farve = auto"

Lad os se på resultater, hvor der er flere linjer, der matcher. Vi ser efter ordet "Gennemsnit" i en applikationslogfil. Da vi ikke kan huske, om ordet er med små bogstaver i logfilen, bruger vi indstillingen -i (ignorere store og små bogstaver):

grep -i Gennemsnitlig nørd-1.log

Hver matchende linje vises med den matchende tekst fremhævet i hver enkelt linje.

Vi kan vise de linjer, der ikke matcher, ved at bruge indstillingen -v (inverter match).

grep -v Mem geek-1.log

Der er ingen fremhævning, fordi det er de linjer, der ikke matcher.

Vi kan få greptil at være helt stille. Resultatet sendes til skallen som en returværdi fra grep. Et resultat på nul betyder, at strengen blev fundet, og et resultat af en betyder, at den ikke blev fundet. Vi kan kontrollere returkoden ved hjælp af de  $?specielle parametre:

grep -q gennemsnitlig nørd-1.log
ekko $?
grep -q howtogeek geek-1.log
ekko $?

Rekursive søgninger med grep

For at søge gennem indlejrede mapper og underkataloger skal du bruge indstillingen -r (rekursiv). Bemærk, at du ikke angiver et filnavn på kommandolinjen, du skal angive en sti. Her søger vi i den aktuelle mappe “.” og eventuelle underkataloger:

grep -r -i memfree.

Outputtet inkluderer biblioteket og filnavnet på hver matchende linje.

Vi kan gøre  grep  følgende symbolske links ved hjælp af indstillingen -R(rekursiv dereference). Vi har et symbolsk link i denne mappe, kaldet logs-folder. Det peger på /home/dave/logs.

ls -l logs-mappe

Lad os gentage vores sidste søgning med muligheden  -R(rekursiv dereference):

grep -R -i memfree.

Det symbolske link følges, og den mappe, det peger på, søges grepogså af.

Søger efter hele ord

Som standard grepmatcher en linje, hvis søgemålet vises et vilkårligt sted i den linje, inklusive inde i en anden streng. Se på dette eksempel. Vi skal søge efter ordet "gratis".

grep -i gratis nørd-1.log

Resultaterne er linjer, der har strengen "fri", men de er ikke separate ord. De er en del af strengen "MemFree."

For at tvinge grep til kun at matche separate “ord” skal du bruge indstillingen -w(ord regexp).

grep -w -i gratis nørd-1.log
ekko $?

Denne gang er der ingen resultater, fordi søgeudtrykket "gratis" ikke vises i filen som et separat ord.

Brug af flere søgeudtryk

Indstillingen -E(udvidet regexp) giver dig mulighed for at søge efter flere ord. ( -EIndstillingen erstatter den forældede egrepversion af grep.)

Denne kommando søger efter to søgeudtryk, "gennemsnit" og "memfree."

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

Alle de matchende linjer vises for hvert af søgeudtrykkene.

Du kan også søge efter flere udtryk, der ikke nødvendigvis er hele ord, men de kan også være hele ord.

Indstillingen -e(mønstre) giver dig mulighed for at bruge flere søgeudtryk på kommandolinjen. Vi bruger funktionen til regulering af reguleringsudtryk til at oprette et søgemønster. Det fortæller grepat matche et hvilket som helst af tegnene, der findes inden for parenteserne "[]." Dette betyder, at det grepvil matche enten “kB” eller “KB”, når det søger.

Begge strenge matches, og faktisk indeholder nogle linjer begge strenge.

Matchende linjer nøjagtigt

Den  -x(linje regexp) vil kun matche linjer, hvor den hele linje matcher søgeordet. Lad os søge efter et dato- og tidsstempel, som vi ved kun vises en gang i logfilen:

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

Den enkelte linje, der matcher, findes og vises.

Det modsatte af det er kun at vise de linjer, der ikke stemmer overens. Dette kan være nyttigt, når du ser på konfigurationsfiler. Kommentarer er gode, men nogle gange er det svært at få øje på de faktiske indstillinger blandt dem alle. Her er /etc/sudoersfilen:

Vi kan effektivt filtrere kommentarlinjerne sådan ud:

sudo grep -v "#" / etc / sudoers

Det er meget lettere at analysere.

Viser kun matchende tekst

Der kan være en lejlighed, hvor du ikke vil se hele den matchende linje, kun den matchende tekst. Indstillingen -o(kun matchende) gør netop det.

grep -o MemFree geek-1.log

Displayet reduceres til kun at vise den tekst, der matcher søgeudtrykket, i stedet for hele den matchende linje.

Tæller med grep

grephandler ikke kun om tekst, det kan også give numeriske oplysninger. Vi kan få greptæller for os på forskellige måder. Hvis vi vil vide, hvor mange gange et søgeudtryk vises i en fil, kan vi bruge indstillingen -c(count).

grep -c gennemsnitlig nørd-1.log

grep rapporterer, at søgeudtrykket vises 240 gange i denne fil.

Du kan få grepvist linjenummer for hver matchende linje ved hjælp af -n(linjenummer) -muligheden.

grep -n Jan geek-1.log

Linjenummeret for hver matchende linje vises i starten af ​​linjen.

Brug indstillingen -m(maks. Antal) til at reducere antallet af resultater, der vises . Vi begrænser output til fem matchende linjer:

grep -m5 -n Jan geek-1.log

Tilføjelse af kontekst

At kunne se nogle ekstra linjer - muligvis ikke-linier - for hver matchende linje er ofte nyttigt. det kan hjælpe med at skelne, hvilke af de matchede linjer er dem, du er interesseret i.

Hvis du vil vise nogle linjer efter den matchende linje, skal du bruge indstillingen -A (efter kontekst). Vi beder om tre linjer i dette eksempel:

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

Hvis du vil se nogle linjer før den matchende linje, skal du bruge indstillingen -B(kontekst før).

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

Og for at medtage linjer fra før og efter den matchende linje skal du bruge indstillingen -C(kontekst).

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

Viser matchende filer

For at se navnene på de filer, der indeholder søgeudtrykket, skal du bruge indstillingen -l (filer med match). sl.hBrug denne kommando for at finde ud af, hvilke C-kildekodefiler der indeholder referencer til headerfilen:

grep -l "sl.h" * .c

Filnavne er anført, ikke de matchende linjer.

Og selvfølgelig kan vi se efter filer, der ikke indeholder søgeudtrykket. Indstillingen -L(filer uden match) gør netop det.

grep -L "sl.h" * .c

Start og slutning af linjer

Vi kan tvinge greptil kun at vise kampe, der enten er i starten eller slutningen af ​​en linje. Operatøren “^” regulært udtryk matcher starten på en linje. Næsten alle linjerne i logfilen vil indeholde mellemrum, men vi skal søge efter linjer, der har et mellemrum som deres første tegn:

grep "^" geek-1.log

Linjerne, der har et mellemrum som det første tegn - i starten af ​​linjen - vises.

For at matche slutningen af ​​linjen skal du bruge operatoren “$” med regulært udtryk. Vi skal søge efter linjer, der slutter med "00".

grep "00 $" geek-1.log

Displayet viser de linjer, der har "00" som deres sidste tegn.

Brug af rør med grep

Selvfølgelig kan du pibe input til grep, pibe output fra grepet andet program og har grepplaceret midt i en rørkæde.

Lad os sige, at vi vil se alle forekomster af strengen "ExtractParameters" i vores C-kildekodefiler. Vi ved, at der kommer en hel del, så vi sender output til less:

grep "ExtractParameters" * .c | mindre

Outputtet er præsenteret i less.

Dette giver dig mulighed for at bladre gennem filoversigten og bruge less'ssøgefunktionen.

Hvis vi pibe outputtet fra grepind wcog bruge -l(linjer) option, kan vi tælle antallet af linjer i kildekoden filer, der indeholder ”ExtractParameters”. (Vi kunne opnå dette ved hjælp af grep-c(count) -indstillingen, men dette er en pæn måde at demonstrere piping ud af grep.)

grep "ExtractParameters" * .c | wc -l

Med den næste kommando rør vi output fra lsind til grepog rør output fra grepind sort. Vi lister filerne i den aktuelle mappe, vælger dem med strengen "Aug" og sorterer dem efter filstørrelse:

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

Lad os nedbryde det:

  • ls -l : Udfør en langformatliste over filerne ved hjælp af ls.
  • grep “Aug” : Vælg de linjer fra lslisten, der indeholder “Aug”. Bemærk, at dette også vil finde filer, der har "Aug" i deres navne.
  • sorter + 4n : Sorter output fra grep i den fjerde kolonne (filstørrelse).

Vi får en sorteret liste over alle filerne ændret i august (uanset år) i stigende rækkefølge efter filstørrelse.

RELATERET: Sådan bruges rør på Linux

grep: Mindre en kommando, mere af en allieret

greper et fantastisk værktøj at have til din rådighed. Det stammer fra 1974 og går stadig stærkt, fordi vi har brug for, hvad det gør, og intet gør det bedre.

Kobling grepmed nogle regulære udtryk-fu tager det virkelig til det næste niveau.

RELATERET: Sådan bruges grundlæggende regulære udtryk til at søge bedre og spare tid