close

Grep

Hop til navigation Hop til søgning

Inden for datalogi er grep ( generel r egular og xpression print ) en kommando fra Unix og Unix-lignende systemer og mere generelt POSIX [1] og GNU [2] systemerne , som søger i en eller flere tekstfiler linjer, der matcher et eller flere specificerede mønstre med regulære udtryk eller bogstavelige strenge , og producerer en liste over de linjer (eller endda bare filnavne), der blev matchet. Det er en type filter .

grep bruges almindeligvis til at søge efter forekomster af et eller flere ord i en række filer, ofte sammen med kommandoerne find og xargs via en softwarepipeline .

grep kan generelt også bruges med binære filer , for eksempel til at søge efter tilstedeværelsen af ​​bestemte Exif -tags i filer, der indeholder digitale billeder . Især GNU-versionen af ​​grep i dette tilfælde viser navnene på de filer, der indeholder den angivne streng eller regulære udtryk (og ikke også den tilsvarende tekstdel, som det normalt er tilfældet for tekstfiler).

Brug

Den generelle syntaks for grep er:

grep [ optioner ] [-e] model1 [-e model2 ...] [-] [ fil1 [ fil2 ...]]

Valgfri filparametre angiver navnene på de filer, der skal søges i. Hvis det ikke er angivet, udføres søgningen på de data, der læses fra standardindgangen . Ved at angive mere end én filparameter , indledes hver linje, som der blev fundet et match for, navnet på den fil, der indeholder den, og dens linjenummer; i tilfælde af en enkelt filparameter (eller ingen) , er kun indholdet af selve linjen angivet.

Skabelonparametre angiver søgekriterierne, og standardadfærden er, at de er regulære udtryk . En linje matcher, hvis den opfylder mindst et af mønstrene.

Den dobbelte tankestreg --(valgfrit) angiver, at følgende parametre ikke skal betragtes som valgmuligheder.

Blandt de vigtigste muligheder er:

-i
Ignorer forskellene mellem store og små bogstaver.
-n
Sæt linjenummeret i filen foran hver linje med resultater (startende med 1).
-l
Angiver kun navnene på filer, hvori der blev fundet mindst ét ​​match (hver fil er kun opført én gang, uanset antallet af matches fundet i den).
-v
Negerer de angivne mønstre og producerer en liste over linjer, der ikke opfylder noget mønster.
-E
Mønstre er udvidede regulære udtryk snarere end grundlæggende regulære udtryk.
-F
Mønstre er strenge , der skal søges bogstaveligt.
-c
Producerer for hver fil kun antallet af linjer, der matcher.

GNU- versionen af ​​grep (tilgængelig for eksempel på GNU / Linux-systemer ) understøtter blandt andet følgende muligheder:

-numero
Hver linje, for hvilken der blev fundet et match, er opført sammen med det angivne antal linjer ved siden af ​​den (for at give kontekst). Hver linje er kun opført én gang, så selvom der er kampe i tilstødende linjer, vil de ikke blive gentaget.
-A numero
Følger hver linje, for hvilken der er fundet et match, med det angivne antal linjer, der følger efter den ("A"et står for efter - efter).
-B numero
Gå foran hver linje, som en match blev fundet, med det angivne antal linjer forud for den ("B" står for før - før).

Varianter

Der er også historisk varianter af grep kaldet egrep og fgrep , som fortolker mønstre som henholdsvis udvidede regulære udtryk og bogstavelige strenge.

Brug af mulighederne -Eog -Fsvarer til at bruge disse varianter.

Oprindelse af navnet grep

Navnet på programmet stammer fra kommandoen g/re/pfra teksteditoren, og som udfører en lignende funktion, det vil sige at søge globalt (dvs. i hele filen og ikke på en enkelt linje) et regulært udtryk ( r egulær og xpression ) og at vise ( print ) matcher .

Opmærksomhedspunkter

Anker teksten for at søge efter

Et regulært udtryk, der ikke har nogen ankre, kan finde et match overalt på linjen, og derfor også midt i et ord. Dette kan være kilden til uventede resultater, hvis det, du ledte efter, faktisk var et helt ord. For eksempel matcher det regulære udtryk "10" også "100", "101", "320103" og så videre.

Løsning med GNU grep

GNU - versionen af ​​grep , udover ankrene i begyndelsen og slutningen af ​​linjen, har også understøttelse af bestemte metategn , der repræsenterer begyndelsen og/eller slutningen af ​​et hvilket som helst ord, og kan bruges til at forankre resten af ​​det almindelige ord. udtryk. Konkret svarer sekvensen \<til et ords startpunkt, \>det punkt hvor et ord slutter og \bstart- eller slutpunktet for et ord. For eksempel \<10\>matcher det regulære udtryk kun i linjer, der indeholder "10" som et separat, visuelt isoleret ord og ikke "100" eller "210".

POSIX Regular Expression Solution

Ankrene leveret af POSIX- standarden er kun dem, der repræsenterer begyndelsen og slutningen af ​​linjen, henholdsvis cirkumfleks-accenten ^og dollarsymbolet $; i dette tilfælde er et muligt middel at udvide det regulære udtryk ved at omgive det med [^[:alnum:]]for eksempel med [^[:alnum:]]10[^[:alnum:]]; dette dækker dog ikke tilfælde, hvor der er et match i begyndelsen eller slutningen af ​​linjen (hvor der ikke er nogen forudgående eller følgende tegn), og det dækker heller ikke tilfælde, hvor udtrykket er hele linjen. For også at overveje disse situationer er det nødvendigt at udvide de fire sager manuelt ved at bruge flere muligheder -e. For eksempel ville grep -kommandolinjen blive:

grep -e "[^ [: alnum:]] 10 [^ [: alnum:]]" -e "[^ [: alnum:]] 10 $" -e "^ 10 [^ [: alnum:]]" -e "^ 10 $" ...

Eller du kan også bruge udvidede regulære udtryk ( grep -E option ) og metategn | til at angive flere alternative udtryk, for eksempel:

grep -E "[^ [: alnum:]] 10 [^ [: alnum:]] | [^ [: alnum:]] 10 $ | ^ 10 [^ [: alnum:]] | ^ 10 $" .. .

Bogstavelige strenge søgt efter som regulære udtryk

Standardadfærden for grep er, at de mønstre, der bruges til søgningen, er regulære udtryk og ikke bogstavelige strenge (hvilke den passende mulighed skal angives -F), men det er let at glemme skelnen, da det ikke sker ofte, at du skal søge for tekst, der indeholder metategn som punktet ..

Problemet er, at distinktionen faktisk eksisterer, og at strenge, der indeholder metategn (såsom en numerisk IP-adresse10.10.1.1 ) også er gyldige regulære udtryk, så grep rapporterer ingen fejl, men kan give helt uventede resultater. For eksempel 10.1.1.1matcher det regulære udtryk også i 10.101.1eller i 1091a1b1ellers, og sammen med at det ikke er forankret øges muligheden for uventede resultater.

En mulig løsning er at bruge muligheden -Ffor at udføre bogstavelige søgninger; dette forhindrer dog, at teksten forankres (husk, at den bogstavelige streng 10.1.1.1også matcher i 10.1.1.100eller endda 210.1.1.1).

Hvis dette var et problem, er det nødvendigt endnu en gang at ty til regulære udtryk, hvilket angiver, at metategnene skal betragtes bogstaveligt ved at sætte dem foran en efter en med skråstreg \og derefter fortsætte som for det tilfælde, hvor et anker er nødvendigt. For eksempel med GNU-versionen af ​​grep :

grep -e '\ <10 \ .1 \ .1 \ .1 \>'...

Brug af skråstreg

Tekstskallene i Unix og Unix -lignende systemer udfører udskiftninger på hele kommandolinjen, før den udføres, inklusive tegnsekvenser, der starter med en omvendt skråstreg \ , når de ikke er angivet i dobbelte eller enkelte anførselstegn. For eksempel kommandolinjen

grep -e 10 \ .1 \ .1 \ .1

omdannes af skallen til

grep -e 10.1.1.1

og så ville grep finde på at søge med det regulære udtryk 10.1.1.1, hvilket sandsynligvis ikke var den oprindelige hensigt.

Regulære udtryk bør derfor angives i dobbelte eller enkelte anførselstegn, som f.eks

grep -e '10 \ .1 \ .1 \ .1 '

Brug med find

For at søge i flere filer i et mappehierarki , bruges grep ofte i kombination med find -kommandoen , for eksempel med:

finde. -type f -navn "* .c" -exec grep -e " udtryk " {} +

Ved at gøre det er der dog muligheden for, at grep påkaldes af find med en enkelt fil at undersøge (for eksempel hvis find kun fandt én fil), i hvilket tilfælde grep fortsætter med at liste de tilsvarende linjer uden at præfiksere dem med filnavnet som de tilhører (som er standardadfærden i tilfælde af en enkelt fil), hvilket giver et andet resultat end det normalt forventede.

For at afhjælpe det, kan du angive navnet på en første fil direkte blandt grep -parametrene, så grep altid påkaldes med mindst to filnavne, der skal undersøges. Til dette formål er den praktisk /dev/null, som altid er til stede og aldrig indeholder data, og er derfor ideel som en "filler"-fil, der ikke påvirker søgninger. For eksempel:

finde. -type f -navn "* .c" -exec grep -e " udtryk " / dev / null {} +

Noter

  1. ^ Grep , om The Open Group Base Specifikationer, udgave 6 IEEE Std 1003.1-2008 . Hentet 26. juni 2009 .
  2. ^ Grep , udskriv linjer, der matcher et mønster , på GNU grep manual . Hentet 19. maj 2008 .

Andre projekter

Eksterne links