Kan noen fortelle meg de tekniske forskjellene mellom grep, egrep, og fgrep og gi passende eksempler?

Når trenger jeg å bruke grep over egrep og omvendt?

Kommentarer

Svar

Historisk ble disse bryterne gitt i separate binærfiler. På noen virkelig gamle Unix-systemer vil du oppdage at du trenger å ringe de separate binærfilene, men på alle moderne systemer er bryterne foretrukket. Mannsiden for grep har detaljer om dette.

Når det gjelder hva de gjør, bytter -E grep til en spesiell modus slik at uttrykket blir evaluert som en ERE (Extended Regular Expression) i motsetning til det normale mønstermatching. Detaljer om denne syntaksen er på mansiden.

-E, --extended-regexp
Tolk MØNSTER som en utvidet regulær uttrykk

-F -bryteren bytter grep til en annen modus der den godtar et mønster å matche, men deretter deler mønsteret opp i en søkestreng per linje og søker ELLER på noen av strengene uten å gjøre noe spesielt mønstermatching.

-F, --fixed-strings
Tolk MØNSTER som en liste over faste strenger, atskilt med nye linjer, hvorav noen skal matches.

Her er noen eksempler på scenarier:

  • Du har en fil med en liste over si ti Unix-brukernavn i ren tekst. Du vil søke i gruppefilen på maskinen din for å se om noen av de ti brukerne som er oppført, er i noen spesielle grupper:

    grep -F -f user_list.txt /etc/group 

    Årsaken til at -F bryteren hjelper her er at brukernavnene i mønsterfilen din blir tolket som ren tekststrenger. Prikker vil for eksempel tolkes som prikker i stedet for jokertegn.

  • Du vil søke med et fancy uttrykk. For eksempel kan parentes () brukes til å indikere grupper med | brukt som OR-operator. Du kan kjøre dette søket ved hjelp av -E:

    grep -E "^no(fork|group)" /etc/group 

    … for å returnere linjer som starter med «nofork» «eller» noggroup «. Uten -E -bryteren, må du unnslippe spesialtegnene som er involvert, fordi de ved normal mønstermatching bare vil søke etter det nøyaktige mønsteret;

Kommentarer

  • Noen systemer har ' t har egrep eller fgrep; -E og -F er standard. Det er faktisk små inkompatibiliteter i egrep: det behandler { litt annerledes.
  • fgrep bruker Aho-Corasick-backend, mens grep bruker en modifisert versjon av Commentz-Walter. Dette betyr at grep har en verste fall O (mn) kompleksitet mens fgrep i verste fall er O (m + n).
  • Gilles " au contraire mon capitan ", noen systemer (eldre kanskje) har kanskje ikke -F mulighet til standard grep, men har en fgrep, noen ppl klager over det på originaltråden jeg fant om å bruke grep til spesialtegn
  • Jeg har nylig skjedd på et Android-system der egrep og grep -E ble håndtert av forskjellige kjørbare filer, BusyBox og BSD grep. De to variantene hadde atferdsforskjeller for ikke-Posix regex-konstruksjoner, for eksempel \s. Dette førte til mye forvirring …

Svar

Fra man grep:

 egrep is the same as grep -E. fgrep is the same as grep -F. Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified. 

Du bruker fgrep eller grep -F du ikke vil at den grepede strengen skal tolkes som et mønster.

Du bruker egrep eller grep -E hvis du trenger å bruke en utvidet regexp.

Svar

egrep og fgrep tilsvarer i utgangspunktet grep -E og grep -F:

  -E, --extended-regexp Interpret PATTERN as an extended regular expression (ERE, see below). (-E is specified by POSIX.) -F, --fixed-strings Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.)  

Feilmeldinger kan variere.

Kommentarer

  • ok, men hva er et utvidet regulært uttrykk? Det forklarer ikke ' nedenfor. Noen få eksempler vil være fine …
  • @isomorphismes: Denne wikibooks-lenken forklarer det pent …

Svar

Fra «man grep»:

tre variantprogrammer egrep, fgrep og rgrep er tilgjengelig. egrep er det samme som grep -E. fgrep er det samme som grep -F. rgrep er det samme som grep -r. Direkte påkalling som enten egrep eller fgrep er utfaset, men er gitt for å la historiske applikasjoner som er avhengige av dem kjøre umodifisert. ul class = «comments»>

  • Spørsmålet ber om et passende eksempel.
  • Svar

    Hvis du søker etter en ordrett streng, og vil være sikker på at strengen du sendte tolkes ordrett (dvs. uten å risikere at et punktum eller spørsmålstegn blir tolket som noe annet) bruker fgrep eller egrep -F.

    Når det gjelder forskjellen mellom egrep og grep, tror jeg at egrep mesteparten av tiden er det du vil ha. GNUs manuelle nettsted viser forskjellene mellom grep og egrep som ser ut til å ligge i syntaksen: noen ting krever skråstrek mens andre ikke gjør det. Jeg tror at egrep er mer «kompatibelt» med perl regexps og javascript regexps, så det er lettere for meg å bruke egrep.

    Btw. Jeg oppfordrer deg virkelig til å prøve ack – den støtter PREGs, og har mer nyttige standarder (dvs. fargelegging, hopper over kataloger som sannsynligvis ikke er som .svn, muligheten til å følge symlinker, og det er litt lettere å skrive ack enn grep -E).

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *