Kan nogen fortælle mig de tekniske forskelle mellem grep, egrep og fgrep og give egnede eksempler?

Hvornår skal jeg bruge grep over egrep og omvendt?

Kommentarer

Svar

Disse switche blev historisk leveret i separate binære filer. På nogle rigtig gamle Unix-systemer vil du opdage, at du skal ringe til de separate binære filer, men på alle moderne systemer foretrækkes switches. Mandsiden for grep har detaljer om dette.

Hvad angår hvad de gør, skifter -E grep til en speciel tilstand, så udtrykket evalueres som en ERE (Extended Regular Expression) i modsætning til dets normale mønster matching. Detaljer om denne syntaks findes på mandsiden.

-E, --extended-regexp
Fortolke MØNSTER som en udvidet regulær udtryk

-F skifter grep til en anden tilstand, hvor den accepterer et mønster, der skal matche, men derefter deler mønsteret op i en søgestreng pr. linje og foretager en ELLER-søgning på en af strengene uden at foretage noget specielt mønstermatch.

-F, --fixed-strings
Fortolke MØNSTER som en liste over faste strenge, adskilt af nye linjer, hvoraf enhver skal matches.

Her er nogle eksempler på scenarier:

  • Du har en fil med en liste over f.eks. Ti Unix-brugernavne i almindelig tekst. Du vil søge i gruppefilen på din maskine for at se, om nogen af de ti anførte brugere er i nogen specielle grupper:

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

    Årsagen til, at -F switch hjælper her er, at brugernavne i din mønsterfil fortolkes som almindelige tekststrenge. Prikker vil f.eks. Blive fortolket som prikker snarere end wild-cards.

  • Du vil søge ved hjælp af et fancy udtryk. For eksempel kan parentes () bruges til at angive grupper med |, der bruges som OR-operator. Du kan køre denne søgning ved hjælp af -E:

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

    … for at returnere linjer, der starter med enten “nofork” “eller” noggroup “. Uden kontakten -E er du nødt til at undslippe de involverede specialtegn, fordi de med normal mønstermatchning bare ville søge efter det nøjagtige mønster;

    grep "^no\(fork\|group\)" /etc/group 

Kommentarer

  • Nogle systemer har ' t har egrep eller fgrep; -E og -F er standard. Der er faktisk små inkompatibiliteter i egrep: det behandler { lidt anderledes.
  • fgrep bruger Aho-Corasick-backend, mens grep bruger en ændret version af Commentz-Walter. Dette betyder, at grep har en worst case O (mn) kompleksitet, mens fgrep i værste fald er O (m + n).
  • Gilles " au contraire mon capitan ", nogle systemer (måske ældre) har muligvis ikke -F mulighed for standard grep, men har en fgrep, nogle ppl klager over det på den oprindelige tråd, jeg fandt ud af om at bruge grep til specialtegn
  • Jeg er for nylig kommet over et Android-system, hvor egrep og grep -E blev håndteret af forskellige eksekverbare filer, BusyBox og BSD grep. De to varianter havde adfærdsmæssige forskelle for ikke-Posix regex-konstruktioner, såsom \s. Dette førte til meget 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 bruger fgrep eller grep -F du ikke ønsker, at den greppede streng skal fortolkes som et mønster.

Du bruger egrep eller grep -E hvis du har brug for en udvidet regexp.

Svar

egrep og fgrep svarer grundlæggende til henholdsvis 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.)  

Fejlmeddelelser kan dog være forskellige.

Kommentarer

  • ok, men hvad er et udvidet regulært udtryk? Det forklarer ikke ' nedenfor. Et par eksempler ville være rart …
  • @isomorphismes: Dette wikibooks-link forklarer det pænt …

Svar

Fra “man grep”:

tre variantprogrammer egrep, fgrep og rgrep er tilgængelige. egrep er det samme som grep -E. fgrep er det samme som grep -F. rgrep er det samme som grep -r. Direkte påkald som enten egrep eller fgrep er udfaset, men leveres for at tillade, at historiske applikationer, der er afhængige af dem, kører umodificerede.

Kommentarer

  • Spørgsmålet beder om et passende eksempel.

Svar

Hvis du søger efter en ordret streng og ønsker at være sikker på, at den streng, du har bestået, fortolkes ordret (dvs. uden at risikere at sige, at en prik eller et spørgsmålstegn fortolkes som noget andet), skal du bruge fgrep eller egrep -F.

Hvad angår forskellen mellem egrep og grep, tror jeg, at egrep oftest er det, du vil have. GNUs manuelle websted viser forskellene mellem grep og egrep, som synes at ligge i syntaksen: nogle ting kræver skråstreg, mens andre ikke gør det. Jeg tror, at egrep er mere “kompatibelt” med perl regexps og javascript regexps, så det er lettere for mig at bruge egrep.

Btw. Jeg opfordrer dig virkelig til at prøve ack – det understøtter PREGs og har mere nyttige standardindstillinger (dvs. farvning, springer sandsynligvis ikke-hvad-du-ønsker mapper som .svn, evnen til at følge symlinks, og det er lidt nemmere at skrive ack end grep -E).

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *