Geekflare recibe el apoyo de nuestra audiencia. Podemos ganar comisiones de afiliación de los enlaces de compra en este sitio.
En Linux y Redes de ordenadores Última actualización: 25 de septiembre de 2023
Compartir en:
Escáner de seguridad de aplicaciones web Invicti - la única solución que ofrece verificación automática de vulnerabilidades con Proof-Based Scanning™.

grep, desarrollado 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 en la herramienta ed, es decir, g/re/p que significa búsqueda globalde una expresión regulare impresión delas líneas coincidentes. grep básicamente busca un patrón o una expresión regular dada a partir de la entrada estándar o de un archivo e imprime las líneas que coinciden con los criterios dados. Suele utilizarse para filtrar detalles innecesarios e imprimir sólo la información necesaria de archivos de registro de gran tamaño

El poder de la expresión regular combinado con las opciones soportadas en grep hace esto posible

Aquí estaremos cubriendo algunos de los comandos grep comúnmente utilizados en diferentes escenarios por administrador de sistemas 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 usa sin tuberías

$ grep <x><x>[opciones]</x></x>

patrón

 [archivos]

Un ejemplo sencillo es
$ grep

 miarchivo.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: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: Enlace de interrupción PCI [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dic 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201225:Dic 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [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 núcleo.
/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: Enlace de interrupción PCI [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 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 núcleo.
/var/log/messages-20201227:Dec 27 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:Dec 27 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>[fichero]</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 la 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 completas

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>[archivo]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

Salida

$ grep -w es archivo_de_texto.txt
Este es un archivo de texto de muestra. 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>[archivo]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

Salida
$ grep

-c es archivo_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/fichero1.txt:Hola Uno
dir1/fichero2.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 muestra. 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 la funcionalidad de grep
. 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.

$

Limitar 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 ejemplo. Se repite dos veces.
$ grep -m2 It text_file.txt
Este es un archivo de texto de muestra.

Contiene


Admite números como 1, 2,

3 etc. así como


$

Visualizar líneas adicionales

A menudo necesitamos no sólo las líneas que tienen un patrón coincidente sino 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, imprima 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 numbers text_file.txt
Soporta números como 1, 2, 3 etc. así como
$ grep -A1 numbers text_file.txt
Soporta números como 1, 2, 3 etc. así como
alfabetos y caracteres especiales como - * # etc.
$ grep -B1 numbers text_file.txt
tipo de datos pero funciona mejor con datos de texto.
Soporta números como 1, 2, 3 etc. así como
$ grep -C1 numbers text_file.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 realmente coincidentes, 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>[archivo]</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_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>[archivo]</x></x></x></x></x></x></x></x></x></x></x></x></x></x>

En el siguiente ejemplo, archivo.txt contiene una línea con una sola palabra "soporte" y como tal es coincidente 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 text_file.txt
Admite números como 1, 2, 3 etc. así como

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

Coincidir con la cadena final

Otra expresión regularmente ú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_texto.txt
Este es un archivo de texto de ejemplo. Contiene la 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 "\.$" text_file.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 buscar 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 terminen con . (no las que puedan 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 pattern.txt
Esto
Esto

$
Para utilizarlo, utilice la bandera -f

$ grep -f patrón.txt 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.

$


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>[archivo]</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 las pruebas de grep
Admite números como 1, 2, 3, etc., así como
Este es un archivo de texto de ejemplo.

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 es Linux

El uso de ERE tiene una ventaja cuando desea tratar los metacaracteres como tales 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, utilice -E con grep es equivalente al comando egrep

$ grep -E '[RegEx Extendido]' <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>

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_MONETARIO LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
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.

  • Abhishek Nair
    Autor
Gracias a nuestros patrocinadores
Más lecturas sobre Linux
Potencia tu negocio
Algunas de las herramientas y servicios que le ayudarán a hacer crecer su negocio.
  • Invicti utiliza el Proof-Based Scanning™ para verificar automáticamente las vulnerabilidades identificadas y generar resultados procesables en tan solo unas horas.
    Pruebe Invicti
  • Web scraping, proxy residencial, gestor de proxy, desbloqueador web, rastreador de motores de búsqueda, y todo lo que necesita para recopilar datos web.
    Pruebe Brightdata
  • Monday.com es un sistema operativo de trabajo todo en uno que te ayuda a gestionar proyectos, tareas, trabajo, ventas, CRM, operaciones, flujos de trabajo y mucho más.
    Prueba Monday
  • Intruder es un escáner de vulnerabilidades en línea que encuentra puntos débiles de ciberseguridad en su infraestructura, para evitar costosas violaciones de datos.
    Prueba Intruder