Cómo usar expresiones regulares con Grep (Regex)

1 mar 2021 6 min di lettura
Cómo usar expresiones regulares con Grep (Regex)
Indice dei contenuti

Introducción

grep es uno de los comandos más útiles y potentes de Linux para procesar archivos. grep busca en uno o más archivos de entrada líneas que coincidan con una expresión regular y escribe cada línea coincidente en la salida estándar.

En este artículo, exploraremos los conceptos básicos de cómo usar expresiones regulares en la versión GNU de grep, que está disponible de forma predeterminada en la mayoría de los sistemas operativos Linux.

Expresión regular grep

Una expresión regular o regex es un patrón que coincide con una serie de cadenas. Un patrón consta de operadores, construye caracteres literales y metacaracteres, que tienen un significado especial. GNU grep admite tres sintaxis de expresiones regulares, básica, extendida y compatible con Perl.

En su forma más simple, cuando no se proporciona ningún tipo de expresión regular, grep interpreta los patrones de búsqueda como expresiones regulares básicas. Para interpretar el patrón como una expresión regular extendida, use la -E (o --extended-regexp ).

En la grep GNU grep no hay diferencia funcional entre la sintaxis básica y extendida de las expresiones regulares. ¿La única diferencia es que en las expresiones regulares básicas los metacaracteres ?, +, {, |, (, y ) se interpretan como caracteres literales. Para conservar los significados especiales de los metacaracteres cuando se utilizan expresiones regulares básicas, los caracteres deben ir precedidos de una barra invertida ( \ ). Más adelante explicaremos el significado de estos y otros metacaracteres.

Generalmente, siempre debe encerrar la expresión regular entre comillas simples para evitar la interpretación de shell y la expansión de metacaracteres.

Encontrar caracteres literales (coincidencias literales)

El uso más básico del grep es buscar un carácter literal o una serie de caracteres en un archivo. Por ejemplo, para mostrar todas las líneas que contienen la cadena "bash" en el /etc/passwd, debe ejecutar 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

En este ejemplo, la cadena "bash" es una expresión regular básica que consta de cuatro caracteres literales. Esto le dice a grep que busque una cadena que tenga una "b" seguida inmediatamente de "a", "s" y "h".

De forma predeterminada, el comando grep distingue entre mayúsculas y minúsculas. Esto significa que los caracteres en mayúsculas y minúsculas se tratan como distintos. Para ignorar la distinción entre mayúsculas y minúsculas al buscar, utilice la -i (o --ignore-case ).

Es importante tener en cuenta que grep busca el patrón de búsqueda como una cadena, no como una palabra. Por lo tanto, si estaba buscando "gnu", grep también imprimirá líneas donde "gnu" está incrustado en palabras más grandes, como "cygnus" o "magnum".

Si la cadena de búsqueda incluye espacios, debe estar entre comillas simples o dobles:

grep "Gnome Display Manager" /etc/passwd

Fondeo

Los anclajes son metacaracteres que le permiten especificar en qué parte de la línea debe encontrarse la coincidencia.

El ^ (cursor) coincide con la cadena vacía al principio de una línea. En el siguiente ejemplo, la cadena "linux" solo coincidirá si aparece al principio de una línea.

grep '^linux' file.txt

El $ (dólar) coincide con la cadena vacía al principio de una línea. Para encontrar una línea que termine con la cadena "linux", debe usar:

grep 'linux$' file.txt

También puede crear una expresión regular utilizando ambos anclajes. Por ejemplo, para buscar líneas que solo contengan "linux", ejecute:

grep '^linux$' file.txt

Otro ejemplo útil es el ^$ que coincide con todas las líneas vacías.

Personaje único a juego

El símbolo . (punto) es un metacarácter que coincide con cualquier carácter. Por ejemplo, para buscar cualquier cosa que comience con "nov" con dos caracteres intermedios y termine con la cadena "llo", utilice el siguiente patrón:

grep 'nov..llo' file.txt

Expresiones entre corchetes

Las expresiones entre corchetes le permiten hacer coincidir un grupo de caracteres encerrándolos entre corchetes []. Por ejemplo, para buscar líneas que contengan "aceptar" o "acento", puede utilizar la siguiente expresión:

grep 'acce[np]t' file.txt

Si el primer carácter dentro del paréntesis es el punto de inserción ^, grep encontrará cualquier carácter que no esté entre paréntesis. El siguiente patrón coincidirá con cualquier combinación de cadenas que comiencen con "co" seguida de cualquier letra excepto "l" seguida de "la", como "coca", "cobalto", etc., pero no coincidirá con líneas que contengan "cola" ":

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

En lugar de colocar los caracteres uno por uno, puede especificar un rango de caracteres entre paréntesis. Una expresión de rango se construye especificando el primer y último carácter del rango separados por un guión. Por ejemplo, [aa] es equivalente a [abcde] y [1-3] es equivalente a [123].

La siguiente expresión coincide con cada línea que comienza con una letra mayúscula:

grep '^[AZ]' file.txt

grep también admite clases de caracteres predefinidas entre paréntesis. La siguiente tabla muestra algunas de las clases de caracteres más comunes:

Cuantificador Clases de personajes
[:alnum:] Caracteres alfanuméricos.
[:alpha:] Caracteres alfabéticos.
[:blank:] Espacio y tabulación.
[:digit:] Dígitos.
[:lower:] Letras minusculas.
[:upper:] Letras mayúsculas.

Para obtener una lista completa de todas las clases de personajes, consulte el manual de Grep.

Cuantificadores

Los cuantificadores le permiten especificar el número de apariciones de elementos que deben estar presentes para que se produzca una coincidencia. La siguiente tabla muestra los cuantificadores compatibles con GNU grep:

Cuantificador Descripción
* Coincide con el elemento anterior cero o más veces.
? Coincide con el elemento anterior cero o una vez.
+ Coincide con el elemento anterior una o más veces.
{n} Coincide con el elemento anterior exactamente n veces.
{n,} Coincide con el elemento anterior al menos n veces.
{,m} Coincide con el elemento anterior como máximo m veces.
{n,m} Haga coincidir el elemento anterior de n a m veces.

El carácter * (asterisco) coincide con el elemento anterior cero o más veces. El siguiente comando encontrará "right", "sright", "ssright" y así sucesivamente:

grep 's*right'

A continuación se muestra un patrón más avanzado que coincide con todas las líneas que comienzan con una letra mayúscula y terminan con un punto y coma. La expresión regular .* Coincide con cualquier número o carácter:

grep -E '^[AZ].*[.,]$' file.txt

El personaje ? (signo de interrogación) hace que el elemento anterior sea opcional y solo puede encontrar una coincidencia. Lo siguiente coincidirá con "brillante" y "correcto". El personaje ? está precedido por una barra invertida (escape) porque estamos usando expresiones regulares básicas:

grep 'b\?right' file.txt

Aquí está la misma expresión regular usando una expresión regular extendida:

grep -E 'b?right' file.txt

El carácter + (más) coincide con el elemento anterior una o más veces. Lo siguiente coincidirá con "sright" y "ssright", pero no con "right":

grep -E 's+right' file.txt

Las llaves {} permiten especificar el número exacto, un límite superior o inferior, o un rango de ocurrencias que deben ocurrir para que ocurra una coincidencia.

Lo siguiente corresponde a todos los números enteros que tienen entre 3 y 9 dígitos:

grep -E '[[:digit:]]{3,9}' file.txt

Alternancia

El término alternancia es un simple "OR". El operador de alternancia | (tubería) le permite especificar varias coincidencias posibles que pueden ser cadenas literales o conjuntos de expresiones. Este operador tiene la precedencia más baja de todos los operadores de expresión regular.

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

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

Si se usa la expresión regular extendida, el | no debe escaparse, como se muestra a continuación:

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

Agrupamiento

La agrupación es una característica de las expresiones regulares que le permite agrupar patrones y usarlos como un único elemento de referencia. Los grupos se crean usando paréntesis ().

Cuando se utilizan expresiones regulares básicas, el paréntesis debe ir precedido de una barra invertida ( \ ).

El siguiente ejemplo coincide con "intrépido" y "menos". ¿El cuantificador ? hace que el grupo (fear) opcional:

grep -E '(fear)?less' file.txt

Expresiones de barra invertida especiales

GNU grep incluye varios metacaracteres que consisten en una barra invertida seguida de un carácter normal. La siguiente tabla muestra algunas de las expresiones de barra invertida especiales más comunes:

Expresión Descripción
\b Coincide con el límite de una palabra.
\< Coincide con una cadena vacía al principio de una palabra.
\> Coincide con una cadena vacía al final de una palabra.
\w Empareja una palabra.
\s Coincidir con un espacio.

El siguiente patrón coincidirá con palabras separadas "abyecto" y "objeto". No coincidirá con palabras si se incorpora en palabras más grandes:

grep '\b[ao]bject\b' file.txt

Conclusión

Las expresiones regulares se utilizan en editores de texto, lenguajes de programación y herramientas de línea de comandos, como grep, sed y awk. Saber cómo crear expresiones regulares puede ser muy útil al buscar archivos de texto, escribir scripts o filtrar la salida de comandos.

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.