grep, desarrollada originalmente para sistemas basados en Unix, es una de las utilidades de línea de comandos más utilizadas en los equipos Linux.

Su nombre proviene de otro comando similar de la herramienta ed, es decir, g/re/p, que significa buscar globalmenteuna expresión regulare imprimirlas líneas coincidentes. grep básicamente busca un patrón o expresión regular dados a partir de la entrada estándar o de un archivo e imprime las líneas que coinciden con los criterios dados. A menudo se utiliza para filtrar detalles innecesarios e imprimir sólo la información necesaria de archivos de registro de gran tamaño.

La potencia de la expresión regular combinada con las opciones soportadas en grep hace esto posible.

Aquí estaremos cubriendo algunos de los comandos grep comúnmente utilizados en diferentes escenarios por sysadmin o desarrollador.

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 utiliza sin tuberías.

$ grep <x><x>[opciones]</x></x> patrón [archivos]

Un ejemplo sencillo es

$ grep mi_archivo.txt
mi_archivo
$

Búsqueda en varios archivos

grep le permite buscar el patrón dado no sólo en uno sino en múltiples archivos. He aquí cómo puede buscar un patrón en múltiples archivos utilizando el comodín *.

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

Salida:

$ sudo grep err /var/log/messages*
/var/log/messages:28 dic 10:36:52 centos7vm kernel: ACPI: Usando IOAPIC para el enrutamiento de interrupciones
/var/log/messages:28 dic 10:36:52 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKA] (IRQs 5 9 10 *11)
/var/log/messages:28 dic 10:36:52 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKB] (IRQs 5 9 *10 11)
/var/log/messages:28 dic 10:36:52 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKC] (IRQs 5 *9 10 11)
/var/log/messages:28 dic 10:36:52 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:23:01:00 centos7vm kernel: ACPI: Usando IOAPIC para el enrutamiento de interrupciones
/var/log/messages-20201225:Dic 23 23:01:00 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dic 23 23:01:00 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201225:Dic 23 23:01:00 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201225:Dic 23 23:01:00 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dic 23 23:01:00 centos7vm kernel: BERT: El soporte de la tabla de registro de errores de arranque está deshabilitado. Habilítelo utilizando bert_enable como parámetro del kernel.
/var/log/messages-20201227:27 dic 19:11:18 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201227:27 dic 19:11:18 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201227:Dic 27 19:11:18 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201227:27 dic 19:11:18 centos7vm kernel: ACPI: Enlace de interrupción PCI [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201227:27 dic 19:11:18 centos7vm kernel: BERT: El soporte de la tabla de registro de errores de arranque está deshabilitado. Habilítelo utilizando bert_enable como parámetro del kernel.
/var/log/messages-20201227:27 dic 19:11:21 centos7vm kernel: [drm:vmw_host_log <x>[vmwgfx]</x>] *ERROR* Error al enviar el mensaje de registro del host.
/var/log/messages-20201227:27 dic 19:11:21 centos7vm kernel: [drm:vmw_host_log <x>[vmwgfx]</x>] *ERROR* Error al enviar el mensaje de registro del host.
$

Puede observar en la salida anterior que primero se imprime el nombre del archivo 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 tener en cuenta las mayúsculas y minúsculas del patrón. Utilice la bandera -i para indicar a grep que ignore mayúsculas y minúsculas.

$ grep -i <x><x><x><x><x><x><x><x><x><x><x>[patrón]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[archivo]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

Salida:

$ grep -i it archivo_texto.txt
Este es un archivo de texto de ejemplo. Contiene
funcionalidad. Siempre puede utilizar grep con cualquier
tipo de datos pero funciona mejor con datos de texto.
Admite números como 1, 2, 3, etc., así como
Este es un archivo de texto de ejemplo. Se repite dos veces.
$

Búsqueda de palabras enteras

No siempre queremos una coincidencia parcial, sino que esperamos que grep busque sólo una palabra completa. Puede hacerlo con la bandera -w.

$ grep -w <x><x><x><x><x><x><x><x><x><x><x>[patrón]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichero]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

Salida:

$ grep -w es fichero_texto.txt
Este es un archivo de texto de ejemplo. Contiene
Este es un archivo de texto de muestra. Se repite dos veces.
$

Comprobar el recuento de coincidencias

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

$ grep -c <x><x><x><x><x><x><x><x><x><x><x>[patrón]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichero]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

Salida:

$ grep -c es fichero_texto.txt
2
$

Buscar en subdirectorios

A menudo es necesario buscar archivos no sólo en el directorio de trabajo actual, sino también en subdirectorios. grep le permite hacerlo fácilmente con la bandera -r.

$ grep -r <x><x><x><x><x><x><x><x><x><x><x>[patrón]</x></x></x></x></x></x></x></x></x></x></x> *

Salida:

$ grep -r Hola *
dir1/archivo1.txt:Hola Uno
dir1/archivo2.txt:Hola Dos
dir1/fichero3.txt:Hola Tres
$

Como puede observar, grep recorre cada subdirectorio dentro del directorio actual y enumera los archivos y 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 precisamente eso con la bandera -v.

$ grep -v <x><x><x><x><x><x><x><x><x><x><x>[patrón]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[archivo]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

Salida:

$ grep Este archivo_de_texto.txt
Este es un archivo de texto de ejemplo. Contiene
Este es un archivo de texto de muestra. Se repite dos veces.
$ grep -v Este archivo_de_texto.txt
varias líneas que se utilizarán como parte de la prueba de grep
funcionalidad. Siempre puede utilizar grep con cualquier
tipo de datos pero funciona mejor con datos de texto.
Soporta números como 1, 2, 3 etc. así como
alfabetos y caracteres especiales como - * # etc.
$

Puede comparar la salida del comando grep en el mismo patrón y archivo con y sin la bandera -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 las líneas impresas, lo que facilita saber en qué parte del fichero se encuentra la línea. Utilice la opción -n como se muestra para obtener los números de línea en la salida.

$ grep -n <x><x><x><x><x><x><x><x><x><x><x>[patrón]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[archivo]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

Salida:

$ grep -n Este_archivo_de_texto.txt
1:Este es un archivo de texto de muestra. Contiene
7:Este es un archivo de texto de muestra. Se repite dos veces.
$

Limit grep Salida

Para archivos grandes como logs, etc. la salida de grep puede ser larga y puede que sólo necesite un número fijo de líneas en la salida en lugar de coincidir con todo. Podemos usar -m<x><x><x><x>[num]</x></x></x></x> para limitar las líneas impresas por num. He aquí cómo utilizarlo:

$ grep -m<x><x><x><x>[num]</x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x>[patrón]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[archivo]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

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

$ grep Es archivo_de_texto.txt
Este es un archivo de texto de ejemplo. Contiene
Admite números como 1, 2, 3, etc., así como
Este es un archivo de texto de muestra. Se repite dos veces.
$ grep -m2 Es archivo_de_texto.txt
Este es un archivo de texto de muestra. Contiene
Admite números como 1, 2, 3, etc., así como
$

Mostrar líneas adicionales

A menudo necesitamos no sólo 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 por encima o por debajo (o ambas) de una línea que tenga un patrón mediante grep utilizando las banderas -A, -B o -C con el valor num. Aquí num denota el número de líneas adicionales a imprimir que están justo por encima o por debajo de la línea coincidente. Esto es aplicable a todas las coincidencias que grep encuentre en el fichero o lista de ficheros especificados.

$ grep -A<x><x><x><x>[num]</x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x>[patrón]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichero]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

O

$ grep -B<x><x><x><x>[</x></x></x></x> num] <x><x><x><x><x><x><x><x><x><x><x>[</x></x></x></x></x></x></x></x></x></x></x> patrón] <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[</x></x></x></x></x></x></x></x></x></x></x></x></x></x>fichero]

O

$ grep -C<x><x><x><x>[</x></x></x></x> num] <x><x><x><x><x><x><x><x><x><x><x>[</x></x></x></x></x></x></x></x></x></x></x> patrón] [ <x><x><x><x><x><x><x><x><x><x><x><x><x><x>fichero</x></x></x></x></x></x></x></x></x></x></x></x></x></x>]

La salida de abajo muestra una salida normal de grep así como la salida con las banderas -A, -B y -C una por una. Observe cómo interpreta grep 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.

Del mismo modo, con la bandera -B1, imprime 1 línea justo antes de la línea coincidente. Con la bandera -C1, imprime 1 línea que está antes y después de la línea coincidente.

$ grep números archivo_de_texto.txt
Admite números como 1, 2, 3, etc., así como
$ grep -A1 números archivo_de_texto.txt
Admite números como 1, 2, 3 etc. así como
alfabetos y caracteres especiales como - * # etc.
$ grep -B1 números archivo_de_texto.txt
tipo de datos pero funciona mejor con datos de texto.
Soporta números como 1, 2, 3 etc. así como
$ grep -C1 números archivo_texto.txt
tipo de datos pero funciona mejor con datos de texto.
Soporta números como 1, 2, 3 etc. así como
alfabetos y caracteres especiales como - * # etc.
$

Listar nombres de archivos

Para imprimir sólo el nombre de los archivos en los que se ha encontrado un patrón en lugar de las líneas coincidentes reales, utilice la bandera -l.

$ grep -l <x><x><x><x><x><x><x><x><x><x><x>[patrón]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichero]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

He aquí un ejemplo de ejecución:

$ grep -l su *.txt
archivo.txt
archivo_de_texto.txt
$

Imprimir líneas exactas

A veces necesitamos imprimir líneas que coincidan exactamente con un patrón dado, no alguna parte de él. grep permite la bandera -x para hacer precisamente eso.

$ grep -x <x><x><x><x><x><x><x><x><x><x><x>[patrón]</x></x></x></x></x></x></x></x></x></x></x> <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[</x></x></x></x></x></x></x></x></x></x></x></x></x></x>archivo]

En el siguiente ejemplo, archivo.txt contiene una línea con una sola palabra «soporte» y como tal es igualada por grep con la bandera -x mientras ignora las líneas que puedan contener las palabras «soporte» junto con otro texto.

$ grep -x soporte *.txt
archivo.txt:soporte
$ 

Coincidencia de la cadena inicial

Utilizando expresiones regulares, podemos encontrar una cadena al principio de una línea. He aquí cómo hacerlo.

$ grep <x><x>[opciones]</x></x> "^<x>[cadena]</x>" <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[archivo]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

Ejemplo:

$ grep Es archivo_de_texto.txt
Este es un archivo de texto de ejemplo. Contiene
Admite números como 1, 2, 3, etc., así como
Este es un archivo de texto de muestra. Se repite dos veces.
$ grep ^It archivo_de_texto.txt
Admite números como 1, 2, 3 etc. así como
$

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

Coincidir con la cadena final

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

$ grep <x><x>[opciones]</x></x> "<x>[cadena]</x>$" <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[archivo]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

Ejemplo:

$ grep "\." archivo_de_texto.txt
Este es un archivo de texto de ejemplo. Contiene
funcionalidad. Siempre puede utilizar grep con cualquier
tipo de datos pero funciona mejor con datos de texto.
Admite números como 1, 2, 3 etc. así como
alfabetos y caracteres especiales como - * # etc.
Este es un archivo de texto de ejemplo. Se repite dos veces.
$ grep "\.$" archivo_de_texto.txt
tipo de datos pero funciona mejor con datos de texto.
alfabetos y caracteres especiales como - * # etc.
Este es un archivo de texto de ejemplo. Se repite dos veces.
$

Intentamos hacer coincidir un carácter . al final de la línea. Como el punto (.) es un carácter de significado especial, necesitamos escaparlo con \ carácter. Observe de nuevo cómo varía la salida cuando sólo emparejamos el carácter . y cuando utilizamos $ para ordenar a grep que empareje sólo las líneas que terminan con . (no las que pueden contenerlo en cualquier lugar intermedio).

Utilizar el archivo de patrones

Puede haber situaciones en las que tenga alguna lista compleja de patrones que utilice a menudo. En lugar de escribirla cada vez, puede especificar una lista de patrones en un archivo y utilizarla con la bandera -f. El archivo debe contener un patrón por línea.

$ grep -f [archivo_patrón] [archivo_a_comparar]

En nuestro ejemplo, hemos creado un archivo de patrones llamado patrón .t xt con el siguiente contenido:

$ cat patrón.txt
Este
Esto
$

Para utilizarlo, utilice la bandera -f.

$ grep -f patrón.txt archivo_de_texto.txt
Este es un archivo de texto de muestra. Contiene
Admite números como 1, 2, 3, etc., así como
Este es un archivo de texto de muestra. Se repite dos veces.
$

Especificar varios patrones

grep permite especificar múltiples patrones utilizando la bandera -e.

$ grep -e [patrón1] -e [patrón2] -e [patrón3]...<x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichero]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

Ejemplo:

$ grep -e es -e Es -e a archivo_de_texto.txt
Este es un archivo de texto de ejemplo. Contiene
varias líneas que se utilizarán como parte de la prueba de grep
Admite números como 1, 2, 3, etc., así como
Este es un archivo de texto de muestra. Se repite dos veces.
$

Especificar RegEx extendido

grep también soporta Expresiones Regulares Extendidas o ERE utilizando la bandera -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 quiere sustituirlos por cadenas como grep. Esto le da más flexibilidad en términos de escaparlos como se nos exige en el caso de grep. Dicho esto, utilizar -E con grep es equivalente al comando egrep.

$ grep -E '[Extended RegEx]' <x><x><x><x><x><x><x><x><x><x><x><x><x><x>[fichero]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

He aquí un uso de ERE en el que queremos imprimir líneas que no estén comentadas o en blanco. Esto es especialmente útil para encontrar algo en archivos de configuración grandes. He utilizado adicionalmente la bandera -v para NO imprimir las 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 sí
ChallengeResponseAuthentication no
GSSAPIAuthentication sí
GSSAPICleanupCredentials no
UsePAM sí
X11Forwarding sí
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 IDIOMA
AcceptEnv XMODIFICADORES
Subsistema sftp /usr/libexec/openssh/sftp-server
$

Conclusión

Los ejemplos anteriores son sólo la punta del iceberg. grep admite toda una serie de opciones y puede ser una herramienta muy útil en manos de una persona que sepa utilizarla con eficacia. No sólo podemos utilizar los ejemplos anteriores, sino combinarlos de diferentes maneras para obtener lo que necesitamos.

Consulte su página man para leer más sobre ella.

$ man grep

A continuación, conozca ejemplos de comandos SFTP.