¿Alguien puede decirme las diferencias técnicas entre grep
, egrep
, y fgrep
y proporcionar ejemplos adecuados?
¿Cuándo debo usar grep
sobre egrep
y viceversa?
Comentarios
- superusuario tiene una gran ilustración de las diferencias entre grep, egrep, fgrep y pgrep: superuser.com/questions/508881/…
Respuesta
Históricamente, estos modificadores se proporcionaban en binarios separados. En algunos sistemas Unix realmente antiguos, encontrará que necesita llamar a 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 la coincidencia de patrones. Los detalles de esta sintaxis se encuentran en la página del manual.
-E, --extended-regexp
Interprete PATTERN como un estándar extendido expresión
El conmutador -F
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 Unix en texto plano. 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
-F
switch ayuda aquí es que los nombres de usuario en su archivo de patrón 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, se puede usar paréntesis
()
para indicar grupos con|
usado como 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» sin grupo «. Sin el conmutador
-E
, tendría que escapar de los caracteres especiales involucrados porque con la coincidencia de patrones normal solo buscarían ese patrón exacto;grep "^no\(fork\|group\)" /etc/group
Comentarios
- Algunos sistemas no ' no tienen
egrep
ofgrep
;-E
y-F
son estándar. En realidad, existen pequeñas incompatibilidades enegrep
: trata{
de forma ligeramente diferente. -
fgrep
usa el backend Aho-Corasick, mientras quegrep
usa una versión modificada de Commentz-Walter. Esto significa quegrep
tiene el peor de los casos de complejidad O (mn) mientras quefgrep
tiene el peor de los casos O (m + n). - Gilles " au contraire mon capitan ", algunos sistemas (quizás más antiguos) pueden no tener la opción -F para grep estándar, pero tengo un fgrep, algunas personas se quejan de eso en el hilo original que encontré sobre el uso de grep para caracteres especiales
- Recientemente me encontré con un sistema Android en el que
egrep
ygrep -E
fueron manejados por diferentes ejecutables, BusyBox y BSD grep. Las dos variantes tenían diferencias de comportamiento para las construcciones de expresiones regulares que no son de Posix, como\s
. Esto generó mucha confusión …
Respuesta
De man grep
:
egrep is the same as grep -E. fgrep is the same as grep -F. Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.
Utiliza fgrep
o grep -F
si no desea que la cadena grepped se interprete como un patrón.
Utiliza egrep
o grep -E
si necesita usar una expresión regular extendida.
Respuesta
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.
Comentarios
- ok, pero ¿qué es una expresión regular extendida? No ' realmente se explica a continuación. Unos pocos ejemplos serían buenos …
- @isomorphismes: Este enlace de wikilibros lo explica muy bien …
Respuesta
De «man grep»:
Se encuentran disponibles tres programas variantes egrep, fgrep y rgrep. 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á obsoleta, pero se proporciona para permitir que las aplicaciones históricas que dependen de ellas se ejecuten sin modificaciones.
Comentarios
- La pregunta pide un ejemplo adecuado.
Responder
Si busca una cadena literal y desea asegurarse de que la cadena que pasó se interprete literalmente (es decir, sin correr el riesgo de que un punto o un signo de interrogación se interprete como otra cosa) 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 quieres. El sitio del manual GNU enumera las diferencias entre grep y egrep que parecen estar en la sintaxis: algunas cosas requieren barras y otras no. Creo que egrep es más «compatible» con perl regexps y javascript, por lo que es más fácil para mí usar egrep.
Por cierto. Realmente te animo a que pruebes ack : admite PREG y tiene valores predeterminados más útiles (es decir, colorear, omitir directorios que probablemente no sean lo que quieras como .svn, la capacidad de seguir enlaces simbólicos y es un poco más fácil escribir ack que grep -E).