Kan någon berätta för mig de tekniska skillnaderna mellan grep, egrep och fgrep och ge lämpliga exempel?

När behöver jag använda grep över egrep och vice versa?

Kommentarer

Svar

Historiskt sett tillhandahölls dessa växlar i separata binärer. På vissa riktigt gamla Unix-system kommer du att upptäcka att du måste ringa de separata binärfilerna, men på alla moderna system föredras omkopplarna. Man-sidan för grep har detaljer om detta.

När det gäller vad de gör ändrar -E grep till ett speciellt läge så att uttrycket utvärderas som ett ERE (Extended Regular Expression) i motsats till dess normala mönstermatchning. Detaljer om denna syntax finns på mansidan.

-E, --extended-regexp
Tolk PATTERN som en utökad regelbunden uttryck

-F växlar grep till ett annat läge där det accepterar ett mönster som matchar, men sedan delar upp mönstret i en söksträng per rad och gör en ELLER-sökning på någon av strängarna utan att göra något speciellt mönstermatchning.

-F, --fixed-strings
Tolk PATTERN som en lista med fasta strängar, åtskilda av nysträngar, varav någon ska matchas.

Här är några exempel på scenarier:

  • Du har en fil med en lista med tio Unix-användarnamn i klartext. Du vill söka i gruppfilen på din maskin för att se om någon av de tio användare som finns med i någon speciell grupp:

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

    Anledningen till att -F -omkopplaren hjälper här att användarnamnen i din mönsterfil tolkas som enkla textsträngar. Prickar till exempel skulle tolkas som punkter snarare än jokertecken.

  • Du vill söka med ett snyggt uttryck. Till exempel parentes () kan användas för att indikera grupper med | som används som OR-operatör. Du kan köra den här sökningen med -E:

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

    … för att returnera rader som börjar med antingen ”nofork ”eller” noggrupp ”. Utan -E -omkopplaren måste du undkomma de specialtecken som är inblandade, för med normal mönstermatchning skulle de bara söka efter det exakta mönstret.

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

Kommentarer

  • Vissa system har ' t har egrep eller fgrep; -E och -F är standard. Det finns faktiskt små inkompatibiliteter i egrep: det behandlar { något annorlunda.
  • fgrep använder Aho-Corasick-backend, medan grep använder en modifierad version av Commentz-Walter. Detta betyder att grep har värsta fall O (mn) -komplexitet medan fgrep i värsta fall är O (m + n).
  • Gilles " au contraire mon capitan ", vissa system (äldre kanske) kanske inte har -F-alternativ till standardgrep men ha en fgrep, några ppl klagar över att på den ursprungliga tråden jag hittade om att använda grep för specialtecken
  • Jag hände nyligen på ett Android-system där egrep och grep -E hanterades av olika körbara filer, BusyBox och BSD grep. De två varianterna hade beteendeskillnader för icke-Posix-regex-konstruktioner, såsom \s. Detta ledde till mycket förvirring …

Svar

Från 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 använder fgrep eller grep -F du don ”t vill att den greppade strängen ska tolkas som ett mönster.

Du använder egrep eller grep -E om du behöver använda en utökad regexp.

Svar

egrep och fgrep motsvarar i princip grep -E och grep -F (respektive):

  -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.)  

Felmeddelanden kan dock skilja sig.

Kommentarer

  • ok, men vad är ett utökat reguljärt uttryck? Det förklaras inte ' nedan. Några exempel skulle vara trevliga …
  • @isomorphismes: Den här wikibooks-länken förklarar det snyggt …

Svar

Från ”man grep”:

tre variantprogram egrep, fgrep och rgrep finns tillgängliga. egrep är samma som grep -E. fgrep är samma som grep -F. rgrep är samma som grep -r. Direkt anrop som antingen egrep eller fgrep utfas, men tillhandahålls för att tillåta historiska applikationer som är beroende av dem att köra omodifierade.

Kommentarer

  • Frågan kräver ett lämpligt exempel.

Svar

Om du söker efter en verbatim-sträng och vill vara säker på att strängen du skickade tolkas verbatim (dvs. utan att riskera att en prick eller ett frågetecken tolkas som något annat) använder fgrep eller egrep -F.

När det gäller skillnaden mellan egrep och grep, tror jag att egrep oftast är det du vill ha. GNU: s manuella webbplats listar skillnaderna mellan grep och egrep som tycks ligga i syntaxen: vissa saker kräver snedstreck medan andra inte gör det. Jag tror att egrep är mer ”kompatibelt” med perl regexps och javascript regexps så det är lättare för mig att använda egrep.

Btw. Jag uppmuntrar dig verkligen att ge ack ett försök – det stöder PREGs och har mer användbara standardinställningar (dvs. färgläggning, hoppa över antagligen inte vad du vill ha kataloger som .svn, förmåga att följa symlänkar, och det är lite lättare att skriva ack än grep -E).

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *