Cómo usar el comando Grep en Linux

27 feb 2021 7 min di lettura
Cómo usar el comando Grep en Linux
Indice dei contenuti

Introducción

El grep que significa "impresión de expresión regular global" es uno de los comandos más poderosos y de uso común en Linux.

Grep busca uno o más archivos de entrada buscando líneas que coincidan con un patrón particular y escribe cada línea coincidente en la salida estándar. Si no se especifica ningún archivo, grep lee la entrada estándar, que suele ser la salida de otro comando.

En este tutorial, le mostraremos cómo usar el grep través de ejemplos prácticos y explicaciones detalladas de las grep

Sintaxis del comando grep

Antes de entrar en cómo usar el grep, comencemos mirando la sintaxis básica.

La sintaxis de grep toma la siguiente forma:

grep [OPTIONS] PATTERN [FILE...]

Los elementos entre corchetes son opcionales.

  • OPTIONS: cero o más opciones. Grep ofrece una serie de opciones que controlan su comportamiento.
  • PATTERN - Modelo de búsqueda.
  • FILE: cero o más nombres de archivo de entrada.

Para poder buscar el archivo, el usuario que ejecuta el comando debe tener acceso de lectura al archivo.

Cómo usar grep para buscar una cadena en archivos

El uso más básico del grep es buscar una cadena (texto) en un archivo.

Por ejemplo, para ver líneas del /etc/passwd contiene la bash, puede usar el siguiente comando:

grep bash /etc/passwd

La salida debería verse así:

root:x:0:0:root:/root:/bin/bash
 noviello:x:1000:1000:noviello:/home/noviello:/bin/bash

Si la cadena incluye espacios, debe encerrarse entre comillas simples o dobles:

grep "Gnome Display Manager" /etc/passwd

Invertir coincidencia (excluir)

Para mostrar líneas que no coinciden con el valor buscado, use la -v (o --invert-match ).

Por ejemplo, para ver líneas en el /etc/passwd que no contienen la cadena nologin puede usar el siguiente comando:

grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
 colord:x:124:124::/var/lib/colord:/bin/false
 git:x:994:994:git daemon user:/:/usr/bin/git-shell
 noviello:x:1000:1000:noviello:/home/noviello:/bin/bash

Cómo usar Grep para buscar una cadena en la salida del comando

En lugar de especificar los archivos de entrada, puede redirigir la salida de otro comando a grep y luego solo mostrar líneas que coincidan con un patrón determinado.

Por ejemplo, para averiguar qué procesos se están ejecutando en el sistema como usuario, www-data puede usar el siguiente ps

ps -ef | grep www-data
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www
 root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
 www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process
 www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

También puede encadenar múltiples tuberías a pedido. Como puede ver en la salida anterior, también hay una línea que contiene el proceso grep Si no desea ver esa línea, pase la salida a otra grep, como se muestra a continuación.

ps -ef | grep www-data | grep -v grep
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www
 root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
 www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process
 www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Búsqueda recursiva

Para buscar de forma recursiva un patrón a utilizar, utilice la -r (o --recursive ). Esto buscará en todos los archivos en el directorio especificado, omitiendo los enlaces simbólicos que se encuentran de forma recursiva. Para seguir todos los enlaces simbólicos, use la -R (o --dereference-recursive ).

En el siguiente ejemplo, buscamos la cadena noviello.it en todos los archivos dentro del directorio /etc

grep -r noviello.it /etc

El comando imprimirá las líneas correspondientes precedidas por la ruta completa al archivo.

/etc/hosts:127.0.0.1 node2.noviello.it
 /etc/nginx/sites-available/noviello.it: server_name noviello.it www.noviello.it;

Si en lugar de usar la -r usa la -R, el grep seguirá todos los enlaces simbólicos:

grep -R noviello.it /etc

Observe la última línea de la salida. Esa línea no está impresa en el ejemplo anterior porque los archivos dentro del sites-enabled son enlaces simbólicos a los archivos de configuración dentro del directorio de sites-available

/etc/hosts:127.0.0.1 node2.noviello.it
 /etc/nginx/sites-available/noviello.it: server_name noviello.it www.noviello.it;
 /etc/nginx/sites-enabled/noviello.it: server_name noviello.it www.noviello.it;

Mostrar solo el nombre de archivo

Para suprimir la grep e imprimir solo los nombres de archivo que contienen el patrón coincidente, puede usar la -l (o --files-with-matches ).

Por ejemplo, para buscar en todos los archivos que terminan con .conf en el directorio de trabajo actual e imprimir solo los nombres de archivo que contienen el tipo de cadena noviello.it:

grep -l noviello.it *.conf

La salida se verá así:

tmux.conf
 haproxy.conf

La -l se usa normalmente junto con la -R recursiva:

grep -Rl noviello.it /tmp

Búsqueda sin distinción entre mayúsculas y minúsculas (Insensible)

De forma predeterminada, el grep mayúsculas y minúsculas. Esto significa que los caracteres en mayúsculas y minúsculas se tratan como distintos.

Para ignorar el caso al buscar, use la -i (o --ignore-case ).

Por ejemplo, al buscar Zebra sin ninguna opción, el siguiente comando no mostrará ningún resultado, es decir, hay líneas coincidentes:

grep Zebra /usr/share/words

Pero si realiza una búsqueda que no distingue entre mayúsculas y minúsculas utilizando la -i, coincidirá con letras mayúsculas y minúsculas:

grep -i Zebra /usr/share/words

Especificar "Zebra" coincidirá con "zebra", "ZEbrA" o cualquier otra combinación de letras mayúsculas y minúsculas para esa cadena.

zebra
 zebra's
 zebras

Búsqueda completa de palabras

Al buscar "gnu", grep imprimirá líneas donde "gnu" está incrustado en palabras más grandes, como "cygnus" o "magnum".

grep gnu /usr/share/words
cygnus
 gnu
 interregnum
 lgnu9d
 lignum
 magnum
 magnuson
 sphagnum
 wingnut

Para devolver solo aquellas líneas donde la cadena especificada es una palabra completa (encerrada por caracteres que no son palabras), use la -w (o --word-regexp ).

Los caracteres de palabra incluyen caracteres alfanuméricos ( az, AZ y 0-9 ) y guiones bajos ( _ ). Todos los demás caracteres se consideran caracteres que no son palabras.

Si ejecuta el mismo comando anterior, incluida la -w, el grep solo devolverá aquellas líneas donde gnu se incluye como una palabra separada.

grep -w gnu /usr/share/words
gnu

Mostrar números de línea

Para mostrar el número de líneas que contienen una cadena que coincide con un patrón, use la -n (o --line-number ). Al usar esta opción, grep imprimirá coincidencias en la salida estándar con el prefijo del número de línea en el que se encontró.

Por ejemplo, para mostrar líneas del /etc/services contiene la cadena bash con el prefijo del número de línea correspondiente, puede usar el siguiente comando:

grep -n 10000 /etc/services

El resultado a continuación muestra que las coincidencias están en las líneas 10423 y 10424.

10423:ndmp 10000/tcp
 10424:ndmp 10000/udp

Contando resultados

Para imprimir un recuento de líneas correspondiente a la salida estándar, use la -c (o --count ).

En el siguiente ejemplo, contamos el número de cuentas que tienen /usr/bin/zsh como shell.

grep -c '/usr/bin/zsh' /etc/passwd
3

Buscar varias cadenas (patrones)

Puede unir dos o más patrones de búsqueda utilizando el |.

De forma predeterminada, grep interpreta el patrón como una expresión regular básica donde metacaracteres como | pierden su significado especial y deben usarse sus versiones inversas.

En el siguiente ejemplo, buscamos todas las apariciones de las palabras fatal, error y critical en el archivo de registro de errores de Nginx:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

Si usa la opción de expresión regular extendida -E (o --extended-regexp ), el | no necesita ser guardado, como se muestra a continuación:

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Modo silencioso

El -q (o --quiet ) le dice a grep no escriba nada en la terminal (salida estándar). Si se encuentra una coincidencia, el comando saldrá con el estado 0. Esto es útil cuando se usa grep en el shell donde desea verificar si un archivo contiene una cadena y realizar una determinada acción en función del resultado.

Aquí hay un ejemplo del uso de grep en modo silencioso como comando de prueba en una declaración if

if grep -q PATTERN filename
 then
 echo pattern found
 else
 echo pattern not found
 fi

Expresión regular básica

GNU Grep tiene dos conjuntos de funciones de expresión regular, Básica y Extendida. De forma predeterminada, grep interpreta el patrón como una expresión regular básica.

Cuando se usa en el modo de expresión regular básico, todos los demás caracteres excepto los metacaracteres son en realidad expresiones regulares que se corresponden con ellos mismos. A continuación se muestra una lista de los metacaracteres más utilizados:

Utilice el ^ (signo de intercalación) para hacer coincidir la expresión al principio de una línea. En el siguiente ejemplo, la ^kangaroo coincidirá solo si aparece al principio de una línea.

grep "^kangaroo" file.txt

Utilice el $ (dólar) para hacer coincidir la expresión con el final de una línea. En el siguiente ejemplo, la cadena kangaroo$ solo coincidirá si aparece al final de una línea.

grep "kangaroo$" file.txt

Utilice el . símbolo (punto) para que coincida con un solo carácter. Por ejemplo, para hacer coincidir cualquier cosa que comience con kan luego tenga dos caracteres y termine con la cadena roo, puede usar el siguiente patrón:

grep "kan..roo" file.txt

Utilice [ ] (paréntesis) para hacer coincidir cualquier carácter entre paréntesis. Por ejemplo, busque líneas que contengan accept o accent, puede usar el siguiente patrón:

grep "acce[np]t" file.txt

Utilice [^ ] (paréntesis) para hacer coincidir cualquier carácter individual entre paréntesis. El siguiente patrón coincidirá con cualquier combinación de cadenas que contengan co(any_letter_except_l)a, como coca, cobalt, etc., pero no coincidirá con las líneas que contengan cola,

grep "co[^l]a" file.txt

Para escapar de un carácter especial posterior, use el \ (barra invertida).

Expresiones regulares extendidas

Para interpretar el patrón como una expresión regular extendida, use la -E (o --extended-regexp ). Las expresiones regulares extendidas incluyen todos los metacaracteres básicos, junto con metacaracteres adicionales para crear patrones de búsqueda más complejos y poderosos. Aquí hay unos ejemplos:

Haga coincidir y extraiga todas las direcciones de correo electrónico de un archivo determinado:

grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt

Haga coincidir y extraiga todas las direcciones IP válidas de un archivo determinado:

grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt

La -o se usa para imprimir solo la cadena coincidente.

Imprimir líneas antes de un resultado

Para imprimir un número específico de líneas antes de las líneas coincidentes, use la -B (o --before-context ).

Por ejemplo, para mostrar cinco líneas de contexto inicial antes de las líneas coincidentes, use el siguiente comando:

grep -B 5 root /etc/passwd

Imprimir líneas después de un resultado

Para imprimir un número específico de líneas después de -A opción -A (o --after-context ).

Por ejemplo, para mostrar cinco líneas de contexto final después de hacer coincidir las líneas, use el siguiente comando:

grep -A 5 root /etc/passwd

Conclusión

El grep permite buscar un patrón dentro de los archivos. Si se encuentra una coincidencia, grep imprimirá las líneas que contienen el patrón especificado.

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.