Zoeken op website

Wat is het verschil tussen Grep, Egrep en Fgrep in Linux?


Een van de bekende zoekhulpmiddelen op Unix-achtige systemen die gebruikt kunnen worden om naar alles te zoeken, of het nu een bestand is, of een regel of meerdere regels in een bestand, is het grep-hulpprogramma. Het is zeer uitgebreid in functionaliteit, wat kan worden toegeschreven aan het grote aantal opties dat het ondersteunt, zoals: zoeken met behulp van een stringpatroon, of een reg-ex-patroon of op perl gebaseerde reg-ex enz.

Vanwege de uiteenlopende functionaliteiten heeft het vele varianten, waaronder grep, egrep (Extended GREP), fgrep (Vaste GREP), pgrep (Proces-GREP), rgrep (Recursieve GREP) etc. Maar deze varianten hebben kleine verschillen met de originele grep, waardoor ze populair zijn geworden en door verschillende Linux-programmeurs voor specifieke taken kunnen worden gebruikt.

Het belangrijkste dat nog moet worden onderzocht, is wat de verschillen zijn tussen de drie hoofdvarianten, namelijk 'grep', 'egrep' en 'fgrep' van grep waardoor Linux-gebruikers de ene of de andere versie kunnen kiezen, afhankelijk van de vereisten.

Enkele speciale metakarakters van grep

  1. + – Equivalent aan een of meer exemplaren van het vorige teken.
  2. ? – Dit duidt op bijna 1 herhaling van het vorige teken. Zoals: a? komt overeen met ‘a’ of ‘aa’.
  3. ( – Begin van afwisselende expressie.
  4. ) – Einde van afwisselende expressie.
  5. | – Komt overeen met een van de expressies gescheiden door '|'. Bijvoorbeeld: “(a|b)cde ” komt overeen met ‘abcde’ of ‘bbcde’.
  6. { – Dit metateken geeft de specificatie voor het begin van het bereik aan. Zoals: “a{2} ” komt overeen met “aa ” in een bestand, d.w.z. a 2 keer.
  7. } – Dit metateken geeft de specificatie voor het einde van het bereik aan.

Verschillen tussen grep, egrep en fgrep

Enkele belangrijke verschillen tussen grep, egrep en fgrep kunnen als volgt worden benadrukt. Voor deze reeks voorbeelden gaan we ervan uit dat het bestand waarop de bewerking wordt uitgevoerd:

Grep-commando

grep of Global Regular Expression Print is het belangrijkste zoekprogramma op Unix-achtige systemen dat kan zoeken naar elk type tekenreeks in elk bestand of lijst met bestanden of zelfs de uitvoer van elk commando.

Voorgesteld lezen: 12 praktische voorbeelden van Linux grep-opdrachten

Het gebruikt standaard reguliere expressies naast normale tekenreeksen als zoekpatroon. In Basic Reguliere Expressies (BRE) zijn metatekens zoals: '{','}','(',')','|','+','?' verliezen hun betekenis en worden behandeld als normale tekens van de string en moeten worden geëscaped als ze als speciale tekens moeten worden behandeld .

Voorgesteld lezen: 11 geavanceerde ‘Grep’-opdrachten voor tekenklassen en haakje-expressies

Bovendien gebruikt grep het Boyer-Moore-algoritme voor het snel doorzoeken van elke tekenreeks of reguliere expressie.

grep -C 0 '(f|g)ile' check_file
grep -C 0 '\(f\|g\)ile' check_file

Zoals hier, wanneer de opdracht wordt uitgevoerd zonder te ontsnappen aan '(' ')' en '|', wordt gezocht naar de volledige tekenreeks, d.w.z. “(f|g )ile ” in het bestand. Maar toen de speciale karakters werden geëscaped, behandelde grep ze in plaats van ze te behandelen als onderdeel van een string, ze als meta-karakters en zocht naar de woorden “file ” of “gile ” in het bestand.

Egrep-commando

Egrep of grep -E is een andere versie van grep of de uitgebreide grep. Deze versie van grep is efficiënt en snel als het gaat om het zoeken naar een patroon voor reguliere expressies, aangezien het metatekens behandelt zoals ze zijn en ze niet vervangt als tekenreeksen zoals in grep, en daarom ben je bevrijd van de last om eraan te ontsnappen als in grep. Het maakt gebruik van ERE of de Extended Regular Expression-set.

In het geval van egrep zou het, zelfs als je niet aan de metatekens ontsnapt, ze behandelen als speciale tekens en ze vervangen door hun speciale betekenis in plaats van ze te behandelen als onderdeel van een string.

egrep -C 0 '(f|g)ile' check_file
egrep -C 0 '\(f\|g\)ile' check_file

Zoals hier zocht egrep naar de tekenreeks “file ” als de metatekens niet waren geëscaped, zoals dit zou betekenen door de betekenis van deze tekens. Maar toen deze karakters werden geëscaped, behandelde egrep ze als onderdeel van de string en zocht naar de volledige string “(f|g)ile ” in het bestand.

fgrep-opdracht

Fgrep of de Vaste grep of grep -F is nog een andere versie van grep die snel is in het zoeken als het gaat om het zoeken naar de hele string in plaats van reguliere expressies, omdat het de reguliere expressies en geen metatekens herkent. Voor het zoeken naar een directe tekenreeks is dit de versie van grep die moet worden geselecteerd.

Fgrep zoekt naar volledige tekenreeksen en herkent zelfs geen speciale tekens als onderdeel van reguliere expressies, zelfs niet als ze wel of niet zijn ontsnapt.

fgrep -C 0 '(f|g)ile' check_file
fgrep -C 0 '\(f\|g\)ile' check_file

Bijvoorbeeld, wanneer meta-tekens niet werden geëscaped, zocht fgrep naar de volledige string “(f|g)ile ” in het bestand, en toen de meta-tekens werden geëscaped, zocht het fgrep-commando naar “\(f\|g\)ile ” alle tekens zoals in het bestand.

We hebben al enkele praktische voorbeelden van grep-opdrachten besproken. Je kunt ze hier lezen als je meer uit grep-opdrachten in Linux wilt halen.

Leer 12 praktische voorbeelden van Linux grep-opdracht

Conclusie

Hierboven zijn de verschillen tussen ‘grep’, ‘egrep’ en ‘fgrep’ gemarkeerd. Afgezien van het verschil in de set gebruikte reguliere expressies en de snelheid van uitvoering, blijven de rest-opdrachtregelparameters hetzelfde voor alle drie de versies van grep en zelfs in plaats van “egrep” of “fgrep”, “grep -E” of “grep - F ” wordt aanbevolen om te gebruiken.

Als je nog andere verschillen tussen deze drie versies van grep tegenkomt, vermeld deze dan in je opmerkingen.