Quina diferència hi ha entre Grep, Egrep i Fgrep a Linux?


Una de les eines de cerca conegudes en sistemes semblants a Unix que es pot utilitzar per cercar qualsevol cosa, ja sigui un fitxer, una línia o diverses línies d'un fitxer és la utilitat grep. Té una funcionalitat molt àmplia, que es pot atribuir a la gran quantitat d'opcions que admet, com ara: cercar mitjançant un patró de cadena, o un patró d'ex-regulació o un ex-regular basat en perl, etc.

A causa de les seves diferents funcionalitats, té moltes variants com grep, egrep (GREP estès), fgrep (GREP fix), pgrep (GREP de procés), rgrep (GREP recursiu), etc. Però aquestes variants tenen diferències menors amb el grep original que les ha fet. popular i per ser utilitzat per diversos programadors de Linux per a tasques específiques.

El principal que queda per investigar és quines són les diferències entre les tres variants principals, és a dir, grep, egrep i fgrep de grep, que fa que els usuaris de Linux escullin una o altra versió segons el requisit.

Alguns meta-personatges especials de grep

  1. +: equival a una o més ocurrències del caràcter anterior.
  2. ? – Això indica gairebé 1 repetició del caràcter anterior. Com: a? Coincidiria amb a o aa.
  3. ( – Inici de l'expressió d'alternança.
  4. ) – Fi de l'expressió d'alternança.
  5. |: coincideix amb qualsevol de les expressions separades per |. Com: \(a|b)cde coincidiria amb 'abcde' o 'bbcde'.
  6. {: aquest metacaràcter indica l'inici de l'especificador d'interval. Com: \a{2}” coincideix amb \aa al fitxer, és a dir, 2 vegades.
  7. }: aquest metacaràcter indica l'especificador del final de l'interval.

Diferències entre grep, egrep i fgrep

Algunes diferències principals entre grep, egrep i fgrep es poden destacar de la següent manera. Per a aquest conjunt d'exemples suposem que el fitxer en què s'està realitzant l'operació és:

grep o Global Regular Expression Print és el principal programa de cerca en sistemes semblants a Unix que pot cercar qualsevol tipus de cadena en qualsevol fitxer o llista de fitxers o fins i tot la sortida de qualsevol comanda.

Utilitza expressions regulars bàsiques a part de les cadenes normals com a patró de cerca. A les expressions regulars bàsiques (BRE), meta-caràcters com: {,},(,),|,+,? perden el seu significat i es tracten com a caràcters normals de cadena i s'han de fer escapar si es volen tractar com a caràcters especials.

A més, grep utilitza l'algorisme de Boyer-Moore per cercar ràpidament qualsevol cadena o expressió regular.

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

Com aquí, quan l'ordre s'executa sense escapar ( ) i | aleshores va cercar la cadena completa, és a dir, \(f|g)ile al fitxer. Però quan es van escapar els caràcters especials, en lloc de tractar-los com a part de la cadena, grep els va tractar com a meta-caràcters i va cercar paraules \fitxer o \gile al fitxer.

Egrep o grep -E és una altra versió de grep o el grep estès. Aquesta versió de grep és eficient i ràpida quan es tracta de cercar un patró d'expressió regular, ja que tracta els metacaràcters tal com són i no els substitueix com a cadenes com a grep, i per tant us allibereu de la càrrega d'escapar-los com a en grep. Utilitza ERE o el conjunt d'expressions regulars ampliades.

En el cas d'egrep, fins i tot si no s'escapa dels meta-caràcters, els tractaria com a caràcters especials i els substituiria pel seu significat especial en lloc de tractar-los com a part de la cadena.

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

Com aquí, egrep va cercar la cadena \fitxer quan els meta-caràcters no s'escapaven, ja que significaria pel significat d'aquests caràcters. Però, quan aquests caràcters es van escapar, llavors egrep els va tractar com a part de la cadena i s'ha cercat la cadena completa \(f|g)ile” al fitxer.

Fgrep o el grep fix o grep -F és una altra versió de grep que és ràpida a l'hora de cercar la cadena sencera en lloc de l'expressió regular, ja que no reconeix les expressions regulars, ni els meta-caràcters. Per cercar qualsevol cadena directa, aquesta és la versió de grep que s'ha de seleccionar.

Fgrep cerca una cadena completa i ni tan sols reconeix els caràcters especials com a part de l'expressió regular, encara que s'escapi o no.

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

Com, quan els meta-caràcters no s'escapaven, fgrep cercava la cadena completa \(f|g)ile” al fitxer, i quan els meta-caràcters s'escapaven, l'ordre fgrep cercava per a \\(f\|g\)ile” tots els caràcters tal com es troben al fitxer.

Ja hem cobert alguns exemples pràctics d'ordres grep, podeu llegir-los aquí, si voleu treure més profit de l'ordre grep a Linux.

Conclusió

A dalt es destaquen les diferències entre 'grep', 'egrep' i 'fgrep'. A part de la diferència en el conjunt d'expressions regulars utilitzades i la velocitat d'execució, els paràmetres de la línia d'ordres rest continuen sent els mateixos per a les tres versions de grep i fins i tot en lloc de \egrep o \fgrep, \grep -E o Es recomana utilitzar \grep -F.

Si trobeu altres diferències entre aquestes tres versions de grep, esmenteu-les als vostres comentaris.