16 ejemplos de comandos grep para ayudarte en el mundo real

grep, desarrollado originalmente para sistemas basados ​​en Unix, es una de las utilidades de línea de comandos más utilizadas en las cajas de Linux.

Su nombre proviene de otro comando similar en la herramienta ed, es decir, g/re/p que significa gramobúsqueda local de un reexpresión regular y pagsimprimir líneas coincidentes. grep básicamente busca un patrón dado o una expresión regular a partir de una entrada o archivo estándar e imprime las líneas que coinciden con los criterios dados. A menudo se usa para filtrar detalles innecesarios mientras se imprime solo la información requerida de grandes archivos de registro.

El poder de la expresión regular combinado con las opciones admitidas en grep lo hace posible.

Aquí cubriremos algunos de los comandos grep comúnmente utilizados en diferentes escenarios por administradores de sistemas o desarrolladores.

Así que empecemos… 👨‍💻

Sintaxis del comando grep

El comando grep espera un patrón y argumentos opcionales junto con una lista de archivos si se usa sin canalización.

$ grep [options] pattern [files]

Un ejemplo sencillo es:

$ grep my file.txt
my_file
$

Búsqueda de varios archivos

grep le permite buscar el patrón dado no solo en uno sino en varios archivos. Así es como puede buscar un patrón en varios archivos usando * comodín.

$ sudo grep -i err /var/log/messages*

Producción:

$ sudo grep err /var/log/messages*
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
$

Puede observar en el resultado anterior que el nombre del archivo se imprime primero antes de imprimir la línea coincidente para indicar dónde encontró grep el patrón dado.

Búsqueda insensible a mayúsculas y minúsculas

grep ofrece buscar un patrón sin mirar el caso del patrón. Use la bandera -i para decirle a grep que ignore las mayúsculas y minúsculas.

$ grep -i [pattern] [file]

Producción:

$ grep -i it text_file.txt
This is a sample text file. It contains
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$

Búsqueda de palabras completas

No siempre queremos una coincidencia parcial, sino que esperamos que grep coincida solo con una palabra completa. Puedes hacer eso con la bandera -w.

$ grep -w [pattern] [file]

Producción:

$ grep -w is text_file.txt
This is a sample text file. It contains
This is a sample text file. It's repeated two times.
$

Comprobar el recuento de coincidencias

A veces, en lugar de la línea coincidente real, solo necesitamos el recuento de coincidencias exitosas que hizo grep. Podemos obtener este conteo usando la opción -c.

$ grep -c [pattern] [file]

Producción:

$ grep -c is text_file.txt
2
$

Buscar subdirectorios

A menudo es necesario buscar archivos no solo en el directorio de trabajo actual sino también en subdirectorios. grep le permite hacer eso fácilmente con la bandera -r.

$ grep -r [pattern] *

Producción:

$ grep -r Hello *
dir1/file1.txt:Hello One
dir1/file2.txt:Hello Two
dir1/file3.txt:Hello Three
$

Como puede observar, grep atraviesa cada subdirectorio dentro de un directorio actual y enumera los archivos y las líneas donde se encuentra una coincidencia.

Búsqueda inversa

Si desea encontrar algo que no coincida con un patrón dado, grep permite hacer exactamente eso con la bandera -v.

$ grep -v [pattern] [file]

Producción:

$ grep This text_file.txt
This is a sample text file. It contains
This is a sample text file. It's repeated two times.
$ grep -v This text_file.txt
several lines to be used as part of testing grep
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
$

Puede comparar la salida del comando grep en el mismo patrón y archivo con y sin el indicador -v. Con -v, se imprimen las líneas que no coinciden con el patrón.

Imprimir números de línea

grep le permite imprimir números de línea junto con líneas impresas, lo que facilita saber dónde está la línea en el archivo. Use la opción -n como se muestra para obtener números de línea en la salida.

$ grep -n [pattern] [file]

Producción:

$ grep -n This text_file.txt
1:This is a sample text file. It contains
7:This is a sample text file. It's repeated two times.
$

Limitar la salida de grep

Para archivos grandes, como registros, etc., la salida de grep puede ser larga y es posible que solo necesite un número fijo de líneas en la salida en lugar de hacer coincidir todo. Podemos usar -m[num] para limitar las líneas impresas por num. He aquí cómo usarlo:

$ grep -m[num] [pattern] [file]

Observe cómo el uso del indicador -m afecta la salida de grep para el mismo conjunto de condiciones en el siguiente ejemplo:

$ grep It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$ grep -m2 It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
$

Mostrar líneas adicionales

A menudo, no solo necesitamos las líneas que tienen un patrón coincidente, sino también algunas líneas por encima o por debajo para un mejor contexto.

Es posible imprimir una línea arriba o abajo (o ambas) de una línea que tenga un patrón usando grep usando las banderas -A, -B o -C con valor numérico. Aquí num indica el número de líneas adicionales que se imprimirán, que está justo encima o debajo de la línea correspondiente. Esto se aplica a todas las coincidencias que encuentra grep en el archivo o la lista de archivos especificados.

$ grep -A[num] [pattern] [file]

O

$ grep -B[num] [pattern] [file]

O

$ grep -C[num] [pattern] [file]

La salida a continuación muestra una salida grep normal, así como una salida con el indicador -A, -B y -C uno por uno. Observe cómo grep interpreta las banderas y sus valores y los cambios en la salida respectiva. Con la bandera -A1, grep imprime 1 línea que sigue justo después de la línea coincidente.

De manera similar, con el indicador -B1, imprime 1 línea justo antes de la línea correspondiente. Con el indicador -C1, imprime 1 línea que está antes y después de la línea coincidente.

$ grep numbers text_file.txt
It supports numbers like 1, 2, 3 etc. as well as
$ grep -A1 numbers text_file.txt
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
$ grep -B1 numbers text_file.txt
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
$ grep -C1 numbers text_file.txt
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
$

Listar nombres de archivos

Para imprimir solo el nombre de los archivos donde se encuentra un patrón en lugar de las líneas que realmente coinciden, use el indicador -l.

$ grep -l [pattern] [file]

Aquí hay un ejemplo de ejecución:

$ grep -l su *.txt
file.txt
text_file.txt
$

Imprimir líneas exactas

A veces necesitamos imprimir líneas que coincidan exactamente con un patrón dado, no con una parte de él. grep permite que el indicador -x haga precisamente eso.

$ grep -x [pattern] [file]

En el siguiente ejemplo, file.txt contiene una línea con solo una palabra “soporte” y, como tal, se compara con grep con el indicador -x mientras se ignoran las líneas que pueden contener las palabras “soporte” junto con otro texto.

$ grep -x support *.txt
file.txt:support
$ 

Cadena de inicio de coincidencia

Usando expresiones regulares, podemos encontrar una cadena al comienzo de una línea. Aquí está cómo hacerlo.

$ grep [options] "^[string]" [file]

Ejemplo:

$ grep It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$ grep ^It text_file.txt
It supports numbers like 1, 2, 3 etc. as well as
$

Observe cómo el uso del carácter ^ cambia la salida. ^ indica el comienzo de la cadena y grep coincidió con ^It como cualquier línea que comience con la palabra It. Encerrar entre comillas puede ayudar cuando el patrón contiene espacios, etc.

Cadena de final de coincidencia

Otra expresión regular común y útil es hacer coincidir el patrón del final de la línea.

$ grep [options] "[string]$" [file]

Ejemplo:

$ grep "\." text_file.txt
This is a sample text file. It contains
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
This is a sample text file. It's repeated two times.
$ grep "\.$" text_file.txt
kind of data but it works best with text data.
alphabets and special characters like - + * # etc.
This is a sample text file. It's repeated two times.
$

Intentamos hacer coincidir un . carácter al final de la línea. Dado que el punto (.) es un carácter de significado especial, necesitamos escaparlo con el carácter \. Nuevamente, observe cómo varía la salida cuando solo hacemos coincidir . carácter y cuando usamos $ para instruir a grep para que coincida solo con las líneas que terminan con . (no los que pueden contenerlo en cualquier punto intermedio).

Usar archivo de patrón

Puede haber situaciones en las que tenga una lista compleja de patrones que utilice con frecuencia. En lugar de escribirlo cada vez, puede especificar una lista de patrones en un archivo y usar con el indicador -f. El archivo debe contener un patrón por línea.

$ grep -f [pattern_file] [file_to_match]

En nuestro ejemplo, hemos creado nombres de archivos de patrón pattern.txt con el siguiente contenido:

$ cat pattern.txt
This
It
$

Para usarlo, use la bandera -f.

$ grep -f pattern.txt text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$

Especificar múltiples patrones

grep permite especificar múltiples patrones usando el indicador -e.

$ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]

Ejemplo:

$ grep -e is -e It -e to text_file.txt
This is a sample text file. It contains
several lines to be used as part of testing grep
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$

Especificar RegEx extendido

grep también admite Expresiones Regulares Extendidas o ERE usando el indicador -E. Esto es similar al comando egrep en Linux.

El uso de ERE tiene una ventaja cuando desea tratar los metacaracteres tal cual y no desea sustituirlos por cadenas como grep. Esto le brinda más flexibilidad en términos de escapar de ellos, como debemos hacer en el caso de grep. Dicho esto, usar -E con grep es equivalente al comando egrep.

$ grep -E '[Extended RegEx]' [file]

Aquí hay un uso de ERE donde queremos imprimir líneas que no están comentadas o en blanco. Esto es especialmente útil para encontrar algo en grandes archivos de configuración. Además, he usado el indicador -v para NO imprimir líneas que coincidan con el patrón ‘^(#|$)’.

$ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile      .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem       sftp    /usr/libexec/openssh/sftp-server
$

Conclusión

Los ejemplos anteriores son solo la punta del iceberg. grep admite una variedad de opciones y puede ser una herramienta muy útil en manos de una persona que sabe cómo usarla de manera efectiva. No solo podemos usar los ejemplos anteriores, sino combinarlos de diferentes maneras para obtener lo que necesitamos.

Consulte su página de manual para leer más al respecto.

$ man grep

A continuación, aprenda ejemplos de comandos SFTP.

Publicaciones relacionadas

Botón volver arriba