¿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?
¿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?
Respuestas:
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.
-E, --extended-regexp
Interpretar PATTERN como una expresión regular extendida
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.
-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 -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
:
grep -E '^no(fork|group)' /etc/group
... 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;
grep '^no\(fork\|group\)' /etc/group
egrep
o fgrep
; -E
Y -F
son estándar. En realidad, hay pequeñas incompatibilidades en egrep
: trata de manera {
ligeramente diferente.
fgrep
usa el backend de Aho-Corasick, mientras que grep
usa una versión modificada de Commentz-Walter. Esto significa que grep
tiene una complejidad O (mn) fgrep
en el peor de los casos, mientras que en el peor es O (m + n).
egrep
y grep -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
:
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 fgrep
o grep -F
si no desea que la cadena grepped se interprete como un patrón.
Usted usa egrep
o grep -E
si necesita usar una expresión regular extendida.
egrep
y fgrep
son básicamente equivalentes a grep -E
y 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.
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.
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).