Kan iemand me de technische verschillen vertellen tussen grep, egrep, en fgrep en geef geschikte voorbeelden?

Wanneer moet ik grep gebruiken voor egrep en vice versa?

Reacties

Antwoord

Historisch werden deze schakelaars geleverd in aparte binaries. Op sommige echt oude Unix-systemen zul je merken dat je de aparte binaries moet oproepen, maar op alle moderne systemen hebben de schakelaars de voorkeur. De man-pagina voor grep heeft hier details over.

Wat betreft wat ze doen, -E schakelt grep over naar een speciale modus zodat de uitdrukking wordt geëvalueerd als een ERE (Extended Regular Expression) in plaats van de normale patroon matching. Details van deze syntaxis staan op de man-pagina.

-E, --extended-regexp
Interpreteer PATTERN als een uitgebreide reguliere expression

De -F -schakelaar schakelt grep in een andere modus waar het een passend patroon accepteert, maar dan splitst dat patroon op in één zoekreeks per regel en voert een OF-zoekopdracht uit op een van de strings zonder speciale patroonovereenkomsten uit te voeren.

-F, --fixed-strings
Interpreteer PATTERN als een lijst met vaste strings, gescheiden door nieuwe regels, die elk overeen moeten komen.

Hier zijn enkele voorbeeldscenarios:

  • Je hebt een bestand met een lijst van bijvoorbeeld tien Unix-gebruikersnamen in platte tekst. U wilt het groepsbestand op uw computer doorzoeken om te zien of een van de tien vermelde gebruikers zich in speciale groepen bevindt:

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

    De reden waarom de -F switch helpt hierbij is dat de gebruikersnamen in uw patroonbestand worden geïnterpreteerd als platte tekstreeksen. Punten zouden bijvoorbeeld worden geïnterpreteerd als punten in plaats van jokertekens.

  • U wilt zoeken met een mooie uitdrukking. Haakjes () kunnen bijvoorbeeld worden gebruikt om groepen aan te duiden met | als een OR-operator. U kunt deze zoekopdracht uitvoeren met -E:

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

    … om regels te retourneren die beginnen met “nofork “of” nogroup “. Zonder de -E schakelaar zou je moeten ontsnappen aan de speciale tekens die erbij betrokken zijn, omdat ze bij normale patroonovereenkomst gewoon naar dat exacte patroon zouden zoeken;

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

Reacties

  • Sommige systemen hebben geen ' t hebben egrep of fgrep; -E en -F zijn standaard. Er zijn in feite kleine incompatibiliteiten in egrep: het behandelt { iets anders.
  • fgrep gebruikt de Aho-Corasick backend, terwijl grep een aangepaste versie van Commentz-Walter gebruikt. Dit betekent dat grep een O (mn) -complexiteit in het slechtste geval heeft, terwijl fgrep in het slechtste geval O (m + n) is.
  • Gilles " au contraire mon capitan ", sommige systemen (misschien ouder) hebben mogelijk geen -F optie voor standaard grep maar heb een fgrep, sommige mensen klagen daarover in de originele thread die ik vond over het gebruik van grep voor speciale tekens.
  • Ik kwam onlangs een Android-systeem tegen waarop egrep en grep -E werden afgehandeld door verschillende uitvoerbare bestanden, BusyBox en BSD grep. De twee varianten hadden gedragsverschillen voor niet-Posix regex-constructies, zoals \s. Dit leidde tot veel verwarring …

Antwoord

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

U gebruikt fgrep of grep -F als je wilt niet dat de grepped string wordt geïnterpreteerd als een patroon.

Je gebruikt egrep of grep -E als u een uitgebreide regexp moet gebruiken.

Antwoord

egrep en fgrep zijn in principe gelijk aan grep -E en grep -F (respectievelijk):

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

Foutmeldingen kunnen echter verschillen.

Reacties

  • ok, maar wat is is een uitgebreide reguliere expressie? Het ' wordt hieronder niet echt uitgelegd. Een paar voorbeelden zouden leuk zijn …
  • @isomorphismes: deze Wikibooks-link legt het mooi uit …

Antwoord

Van “man grep”:

er zijn drie variantprogrammas egrep, fgrep en rgrep beschikbaar. egrep is hetzelfde als grep -E. fgrep is hetzelfde als grep -F. rgrep is hetzelfde als grep -r. Directe aanroep als egrep of fgrep is verouderd, maar wordt geleverd om historische applicaties die ervan afhankelijk zijn, ongewijzigd te laten draaien.

Reacties

  • De vraag vraagt om een geschikt voorbeeld.

Antwoord

Als je zoekt naar een letterlijke string, en je wilt er zeker van zijn dat de string die je hebt gepasseerd woordelijk wordt geïnterpreteerd (dwz zonder het risico te lopen dat een punt of vraagteken als iets anders wordt geïnterpreteerd) gebruik fgrep of egrep -F.

Wat betreft het verschil tussen egrep en grep, ik denk dat egrep meestal is wat je wilt. De GNU-handleidingsite somt de verschillen op tussen grep en egrep die in de syntaxis schijnen te liggen: sommige dingen vereisen schuine strepen, andere niet. Ik denk dat egrep meer “compatibel” is met perl-regexps en javascript-regexps, dus het is gemakkelijker voor mij om egrep te gebruiken.

Btw. Ik raad je echt aan om ack eens te proberen – het ondersteunt PREGs en heeft meer bruikbare standaardinstellingen (bijv. Kleuren, waarschijnlijk-niet-wat-je-wilt-mappen overslaan zoals .svn, mogelijkheid om symlinks te volgen, en het is een beetje gemakkelijker om ack te typen dan grep -E).

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *