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.