¿Cuál es la diferencia entre Grep, Egrep y Fgrep en Linux?


Una de las herramientas de búsqueda de renombre en sistemas similares a Unix que se puede usar para buscar cualquier cosa, ya sea un archivo, una línea o varias líneas en un archivo, es la utilidad grep. Tiene una funcionalidad muy amplia que se puede atribuir a la gran cantidad de opciones que admite, como: búsqueda mediante patrón de cadena, patrón reg-ex o reg-ex basado en perl, etc.

Debido a sus diversas funcionalidades, tiene muchas variantes, incluyendo grep, egrep (GREP extendido), fgrep (GREP fijo), pgrep (Proceso GREP), rgrep (GREP recursivo), etc. Pero estas variantes tienen diferencias menores con el grep original que las ha hecho popular y para ser utilizado por varios programadores de Linux para tareas específicas.

Lo principal que queda por investigar es cuáles son las diferencias entre las tres variantes principales, es decir, "grep", "egrep" y "fgrep" de grep, que hace que los usuarios de Linux elijan una u otra versión según los requisitos.

Algunos metacaracteres especiales de grep

  1. + : equivalente a una o más ocurrencias del carácter anterior.
  2. ? : esto denota casi 1 repetición del carácter anterior. Como: a? Coincidiría con "a" o "aa".
  3. (: comienzo de la expresión de alternancia.
  4. ) : final de la expresión de alternancia.
  5. | : coincide con cualquiera de las expresiones separadas por | . Como: "(a | b) cde" coincidiría con "abcde" o "bbcde".
  6. {: este metacarácter indica el inicio del especificador de rango. Me gusta: "a {2}" coincide con "aa" en el archivo, es decir, a 2 veces.
  7. } : este metacarácter indica el especificador de fin de rango.

Diferencias entre grep, egrep y fgrep

Algunas diferencias principales entre grep, egrep y fgrep se pueden resaltar de la siguiente manera. Para este conjunto de ejemplos, asumimos que el archivo en el que se está realizando la operación es:

grep o Global Regular Expression Print es el principal programa de búsqueda en sistemas similares a Unix que puede buscar cualquier tipo de cadena en cualquier archivo o lista de archivos o incluso la salida de cualquier comando.

Utiliza expresiones regulares básicas además de las cadenas normales como patrón de búsqueda. En Expresiones regulares básicas (BRE), metacaracteres como: {,} , (,) , | , + , ? pierden su significado y se tratan como caracteres normales de una cadena y deben ser escapados si se van a tratar como caracteres especiales.

Además, grep utiliza el algoritmo de Boyer-Moore para buscar rápidamente cualquier cadena o expresión regular.

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

Como aquí, cuando el comando se ejecuta sin escapar de () y | , buscó la cadena completa, es decir, “(f | g) ile” en el archivo. Pero cuando se escaparon los caracteres especiales, en lugar de tratarlos como parte de una cadena, grep los trató como metacaracteres y buscó las palabras "archivo" o "gile" en el archivo.

Egrep o grep -E es otra versión de grep o el grep extendido. Esta versión de grep es eficiente y rápida cuando se trata de buscar un patrón de expresión regular, ya que trata los metacaracteres como están y no los sustituye como cadenas como en grep, y por lo tanto, se libera de la carga de escapar de ellos como en grep. Utiliza ERE o el conjunto de expresiones regulares extendidas.

En el caso de egrep, incluso si no escapa de los metacaracteres, los tratará como caracteres especiales y los sustituirá por su significado especial en lugar de tratarlos como parte de una cadena.

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

Como aquí, egrep buscó la cadena “archivo” cuando los metacaracteres no se escaparon como significaría por el significado de estos caracteres. Pero, cuando estos caracteres se escaparon, egrep los trató como parte de una cadena y buscó la cadena completa “(f | g) ile” en el archivo.

Fgrep o Fixed grep o grep -F es otra versión de grep que es rápida en la búsqueda cuando se trata de buscar la cadena completa en lugar de una expresión regular, ya que no reconoce las expresiones regulares, ni los metacaracteres. Para buscar cualquier cadena directa, esta es la versión de grep que debe seleccionarse.

Fgrep busca una cadena completa y ni siquiera reconoce los caracteres especiales como parte de la expresión regular, incluso si se escapa o no.

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

Por ejemplo, cuando no se escaparon los metacaracteres, fgrep buscó la cadena completa "(f | g) ile" en el archivo, y cuando se escaparon los metacaracteres, el comando fgrep buscó “\ (f\| g \) ile” todos los caracteres como están en el archivo.

Ya hemos cubierto algunos ejemplos prácticos del comando grep, puede leerlos aquí, si desea sacar más provecho del comando grep en Linux.

Conclusión

Arriba se destacan las diferencias entre "grep", "egrep" y "fgrep". Aparte de la diferencia en el conjunto de expresiones regulares utilizadas y la velocidad de ejecución, los parámetros de la línea de comandos rest siguen siendo los mismos para las tres versiones de grep e incluso en lugar de "egrep" o "fgrep", "grep -E" o "grep - Se recomienda utilizar F ”.

Si encuentra otras diferencias entre estas tres versiones de grep, menciónelas en sus comentarios.