¿Cuál es la diferencia entre `grep`,` egrep` y `fgrep`?

273

¿Puede alguien decirme las diferencias técnicas entre grep, egrep, y fgrepy proporcionar ejemplos adecuados?

¿Cuándo necesito usar grepover egrepy viceversa?

mr_eclair
fuente
77
superusuario tiene un gran ejemplo de las diferencias entre grep, egrep, fgrep y pgrep: superuser.com/questions/508881/...
Eric Leschinski

Respuestas:

292
  • egrep es 100% equivalente a grep -E
  • fgrep es 100% equivalente a grep -F

Históricamente, estos interruptores se proporcionaron en binarios separados. En algunos sistemas Unix realmente antiguos, encontrará que necesita llamar a los binarios separados, pero en todos los sistemas modernos se prefieren los conmutadores. La página de manual de grep tiene detalles sobre esto.

En cuanto a lo que hacen, -Ecambia grep a un modo especial para que la expresión se evalúe como ERE (Expresión regular extendida) en lugar de su coincidencia de patrón normal. Los detalles de esta sintaxis se encuentran en la página del manual.

-E, --extended-regexp
Interpretar PATTERN como una expresión regular extendida

El -Finterruptor cambia grep a un modo diferente donde acepta un patrón para que coincida, pero luego divide ese patrón en una cadena de búsqueda por línea y realiza una búsqueda OR en cualquiera de las cadenas sin hacer ninguna coincidencia de patrón especial.

-F, --fixed-strings
Interprete PATTERN como una lista de cadenas fijas, separadas por líneas nuevas, cualquiera de las cuales debe coincidir.

Aquí hay algunos escenarios de ejemplo:

  • Tiene un archivo con una lista de, digamos, diez nombres de usuario de Unix en texto sin formato. Desea buscar el archivo de grupo en su máquina para ver si alguno de los diez usuarios enumerados está en algún grupo especial:

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

    La razón por la que el -Fconmutador ayuda aquí es que los nombres de usuario en su archivo de patrones se interpretan como cadenas de texto sin formato. Los puntos, por ejemplo, se interpretarían como puntos en lugar de comodines.

  • Desea buscar utilizando una expresión elegante. Por ejemplo, el paréntesis ()se puede usar para indicar grupos con |un operador OR. Puede ejecutar esta búsqueda usando -E:

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

    ... para devolver líneas que comienzan con "nofork" o "nogroup". Sin el -Einterruptor, tendrías que escapar de los caracteres especiales involucrados porque con la coincidencia de patrón normal solo buscarían ese patrón exacto;

    grep '^no\(fork\|group\)' /etc/group
    
Caleb
fuente
17
Algunos sistemas no tienen egrepo fgrep; -EY -Fson estándar. En realidad, hay pequeñas incompatibilidades en egrep: trata de manera {ligeramente diferente.
Gilles
44
fgrepusa el backend de Aho-Corasick, mientras que grepusa una versión modificada de Commentz-Walter. Esto significa que greptiene una complejidad O (mn) fgrepen el peor de los casos, mientras que en el peor es O (m + n).
Slater Victoroff
2
Gilles "au contraire mon capitan", algunos sistemas (más antiguos tal vez) pueden no tener la opción -F de grep estándar pero tienen un fgrep, algunas personas se quejan de eso en el hilo original que encontré sobre el uso de grep para caracteres especiales
THESorcerer
Recientemente me topé con un sistema Android en el cual egrepy grep -Efueron manejados por diferentes ejecutables, BusyBox y BSD grep. Las dos variantes tenían diferencias de comportamiento para construcciones de expresiones regulares no Posix, como \s. Esto llevó a mucha confusión ...
Lii
33

De man grep:

 egrep es lo mismo que grep -E.
 fgrep es lo mismo que grep -F. Invocación directa como egrep o  
  fgrep está en desuso, pero se proporciona para permitir aplicaciones históricas
  que confían en ellos para correr sin modificaciones.

Utiliza fgrepo grep -Fsi no desea que la cadena grepped se interprete como un patrón.

Usted usa egrepo grep -Esi necesita usar una expresión regular extendida.

rozcietrzewiacz
fuente
13

egrepy fgrepson básicamente equivalentes a grep -Ey grep -F(respectivamente):

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

Sin embargo, los mensajes de error pueden diferir.

Stéphane Gimenez
fuente
2
ok, pero ¿qué es una expresión regular extendida? Realmente no se explica a continuación. Algunos ejemplos serían buenos ...
isomorphismes
@isomorphismes: este enlace de wikilibros lo explica muy bien ...
zb226
8

De "man grep":

Hay tres programas variantes egrep, fgrep y rgrep disponibles. egrep es lo mismo que grep -E. fgrep es lo mismo que grep -F. rgrep es lo mismo que grep -r. La invocación directa como egrep o fgrep está en desuso, pero se proporciona para permitir que las aplicaciones históricas que se basan en ellas se ejecuten sin modificaciones.

Rufo El Magufo
fuente
2
La pregunta pide un ejemplo adecuado.
isomorfismos el
3

Si busca una cadena literal y desea asegurarse de que la cadena que pasó se interprete literalmente (es decir, sin arriesgarse a decir que un punto o un signo de interrogación se interpretará como algo diferente) use fgrep o egrep -F.

En cuanto a la diferencia entre egrep y grep, creo que egrep es la mayoría de las veces lo que desea. El sitio del manual de GNU enumera las diferencias entre grep y egrep que parecen estar en la sintaxis: algunas cosas requieren barras diagonales mientras que otras no. Creo que egrep es más "compatible" con perl regexps y javascript regexps, por lo que me resulta más fácil usar egrep.

Por cierto. Realmente te animo a dar acuse de recibo una oportunidad - que apoya Pregs, y tiene valores por defecto más útiles (es decir, coloración, saltando directorios probablemente-no-lo-que-quieren como .svn, capacidad de seguir enlaces simbólicos, y es un poco más fácil de escribir ack que grep -E).

qbolec
fuente