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

Respuestas:

85

Diferencias entre grep, pgrep, egrep y fgrep (Linux):

grep

grep es un acrónimo que significa "Impresión de expresiones regulares globales". grep es un programa que escanea un archivo o archivos específicos línea por línea, devolviendo líneas que contienen un patrón. Un patrón es una expresión que especifica un conjunto de cadenas al interpretar los caracteres como metacaracteres. Por ejemplo, el meta carácter de asterisco (*) se interpreta como "cero o más del elemento anterior". Esto permite a los usuarios escribir una serie corta de caracteres y metacaracteres en un comando grep para que la computadora nos muestre en qué líneas coinciden los archivos.

El comando grep estándar se ve así:

grep <flags> '<regular expression>' <filename>

grep imprime los resultados de búsqueda en la pantalla (stdout) y devuelve los siguientes valores de salida:

0    A match was found.
1    No match was found.
>1   A syntax error was found or a file was inaccessible 
     (even if matches were found).

Algunos indicadores comunes son: -cpara contar el número de coincidencias exitosas y no imprimir las coincidencias reales, -ihacer que la búsqueda no sea sensible -na mayúsculas, imprimir el número de línea antes de cada impresión de coincidencia, -vtomar el complemento de la expresión regular (es decir, devolver las líneas que no coinciden), y -lpara imprimir los nombres de los archivos con líneas que coinciden con la expresión.

egrep

egrep es un acrónimo que significa "Impresión de expresiones regulares globales extendidas".

La 'E' en egrep significa tratar el patrón como una expresión regular. "Expresiones regulares extendidas" abreviado 'ERE' está habilitado en egrep. egrep (que es el mismo que grep -E) trata +, ?, |, (, y )como meta-caracteres.

En expresiones regulares básicas (con grep), el meta-caracteres ?, +, {, |, (, y )pierden su significado especial. Si quieres grep para tratar a estos personajes como meta-caracteres, escapar de ellos \?, \+, \{, \|, \(, y \).

Por ejemplo, aquí grep usa expresiones regulares básicas donde el más se trata literalmente, cualquier línea con un más se devuelve.

grep "+" myfile.txt

Por otro lado, egrep trata el "+" como un meta carácter y devuelve cada línea porque más se interpreta como "una o más veces".

egrep "+" myfile.txt

Aquí cada línea se devuelve porque +egrep la trató como un metacarácter. grep normal habría buscado solo líneas con un literal +.

fgrep

fgrep es un acrónimo que significa "Impresión de expresiones regulares globales de cadena fija".

fgrep (que es lo mismo que grep -F) es grep fijo o rápido y se comporta como grep pero NO reconoce ningún meta-carácter de expresión regular como especial. La búsqueda se completará más rápido porque solo procesa una cadena simple en lugar de un patrón complejo.

Por ejemplo, si quisiera buscar en mi .bash_profile un punto literal (.), Usar grep sería difícil porque tendría que escapar del punto porque el punto es un meta carácter que significa 'comodín, cualquier carácter único':

grep "." myfile.txt

El comando anterior devuelve cada línea de myfile.txt. Haz esto en su lugar:

fgrep "." myfile.txt

Entonces solo las líneas que tienen un literal '.' en ellos se devuelven. fgrep nos ayuda a no molestarnos en escapar de nuestros meta personajes.

pgrep

pgrep es un acrónimo que significa "Impresión de expresiones regulares globales de ID de proceso".

pgrep revisa los procesos que se ejecutan actualmente y enumera los ID de proceso que coinciden con los criterios de selección para stdout. pgrep es útil cuando todo lo que quiere saber es el número entero de identificación de proceso de un proceso. Por ejemplo, si quisiera conocer solo la ID del proceso de mi proceso mysql, usaría el comando pgrep mysqlque devolvería una ID del proceso como 7312.

Eric Leschinski
fuente
Del pgrepmanual : el nombre del proceso utilizado para la coincidencia se limita a los 15 caracteres presentes en la salida de / proc / pid / stat . Use la opción -f para comparar con la línea de comando completa, / proc / pid / cmdline .
Pablo A