¿Puede alguien decirme las diferencias técnicas entre grep
, egrep
, y fgrep
y proporcionar ejemplos adecuados?
¿Cuándo necesito usar grep
over egrep
y viceversa?
grep
regular-expression
mr_eclair
fuente
fuente
Respuestas:
egrep
es 100% equivalente agrep -E
fgrep
es 100% equivalente agrep -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,
-E
cambia 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.El
-F
interruptor 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.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:
La razón por la que el
-F
conmutador 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
:... para devolver líneas que comienzan con "nofork" o "nogroup". Sin el
-E
interruptor, tendrías que escapar de los caracteres especiales involucrados porque con la coincidencia de patrón normal solo buscarían ese patrón exacto;fuente
egrep
ofgrep
;-E
Y-F
son estándar. En realidad, hay pequeñas incompatibilidades enegrep
: trata de manera{
ligeramente diferente.fgrep
usa el backend de Aho-Corasick, mientras quegrep
usa una versión modificada de Commentz-Walter. Esto significa quegrep
tiene una complejidad O (mn)fgrep
en el peor de los casos, mientras que en el peor es O (m + n).egrep
ygrep -E
fueron 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 ...De
man grep
:Utiliza
fgrep
ogrep -F
si no desea que la cadena grepped se interprete como un patrón.Usted usa
egrep
ogrep -E
si necesita usar una expresión regular extendida.fuente
egrep
yfgrep
son básicamente equivalentes agrep -E
ygrep -F
(respectivamente):Sin embargo, los mensajes de error pueden diferir.
fuente
De "man grep":
fuente
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).
fuente