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
- superuser heeft een geweldige illustratie van de verschillen tussen grep, egrep, fgrep en pgrep: superuser.com/questions/508881/…
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
offgrep
;-E
en-F
zijn standaard. Er zijn in feite kleine incompatibiliteiten inegrep
: het behandelt{
iets anders. -
fgrep
gebruikt de Aho-Corasick backend, terwijlgrep
een aangepaste versie van Commentz-Walter gebruikt. Dit betekent datgrep
een O (mn) -complexiteit in het slechtste geval heeft, terwijlfgrep
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
engrep -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).