grep
es uno de los comandos más útiles y potentes de Linux para el procesamiento de texto. 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 sobre 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 un conjunto 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 un tipo de expresión regular, grep
interprete los patrones de búsqueda como expresiones regulares básicas. Para interpretar el patrón como una expresión regular extendida, use la opción -E
( o ).--extended-regexp
En la implementación de GNU de grep
no hay diferencia funcional entre las sintaxis de expresiones regulares básicas y extendidas. La única diferencia es que en las expresiones regulares básicas los metacaracteres ?
, +
, {
, |
, (
y )
se interpretan como caracteres literales. Para mantener los significados especiales de los metacaracteres cuando se usan expresiones regulares básicas, los caracteres se deben escapar con una barra invertida ( \
). Más adelante explicaremos el significado de estos y otros metacaracteres.
En general, siempre debe encerrar la expresión regular entre comillas simples para evitar la interpretación y expansión de los metacaracteres por parte del shell.
Coincidencias literales
El uso más básico del grep
comando 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
archivo, ejecutaría el siguiente comando:
grep bash /etc/passwd
La salida debería ser algo como esto:
root:x:0:0:root:/root:/bin/bash
heymarkething:x:1000:1000:heymarkething:/home/heymarkething:/bin/bash
En este ejemplo, la cadena "bash" es una expresión regular básica que consta de cuatro caracteres literales. Esto le indica grep
que busque una cadena que tenga una "b" seguida inmediatamente por "a", "s" y "h".
De forma predeterminada, el grep
comando distingue entre mayúsculas y minúsculas. Esto significa que los caracteres en mayúsculas y minúsculas se tratan como distintos.
Para ignorar mayúsculas y minúsculas al buscar, utilice la -i
opción (o --ignore-case
).
Es importante tener en cuenta que grep
busca el patrón de búsqueda como una cadena, no como una palabra. Entonces, si estaba buscando "gnu", grep
también imprimirá las líneas donde "gnu" está incrustado en palabras más grandes, como "cygnus" o "magnum".
Si la cadena de búsqueda incluye espacios, debe encerrarlo entre comillas simples o dobles:
grep "Gnome Display Manager" /etc/passwd
Anclaje
Los anclas son metacaracteres que le permiten especificar en qué parte de la línea se debe encontrar la coincidencia.
El ^
símbolo de intercalación coincide con la cadena vacía al principio de una línea. En el siguiente ejemplo, la cadena "linux" coincidirá solo si aparece al principio de una línea.
grep '^linux' file.txt
El $
símbolo (dólar) coincide con la cadena vacía al comienzo de una línea. Para encontrar una línea que termine con la cadena "linux", usaría:
grep 'linux$' file.txt
También puede construir una expresión regular utilizando ambos anclajes. Por ejemplo, para buscar líneas que contengan solo "linux", ejecute:
grep '^linux$' file.txt
Otro ejemplo útil es el ^$
patrón que coincide con todas las líneas vacías.
Carácter individual coincidente
El .
símbolo (punto) es un metacarácter que coincide con cualquier carácter único. Por ejemplo, para hacer coincidir cualquier cosa que comience con "kan", luego tenga dos caracteres y termine con la cadena "roo", usaría el siguiente patrón:
grep 'kan..roo' file.txt
Expresiones de paréntesis
Las expresiones entre paréntesis permiten hacer coincidir un grupo de caracteres encerrándolos entre paréntesis []
. Por ejemplo, busca las líneas que contienen “aceptar” o “acento”, podrías usar la siguiente expresión:
grep 'acce[np]t' file.txt
Si el primer carácter dentro de los corchetes es el signo de intercalación ^
, entonces coincide con cualquier carácter único que no esté entre corchetes. El siguiente patrón coincidirá con cualquier combinación de cadenas que comience con "co" seguida de cualquier letra excepto "l" seguida de "la", como "coca", "cobalt", etc., pero no coincidirá con las líneas que contienen "cola ”:
grep 'co[^l]a' file.txt
En lugar de colocar los caracteres uno por uno, puede especificar un rango de caracteres dentro de los corchetes. Una expresión de rango se construye especificando el primer y último carácter del rango separados por un guión. Por ejemplo, [a-a]
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 '^[A-Z]' file.txt
grep
también admiten clases predefinidas de caracteres que están encerrados entre corchetes. 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 tabulador. |
[:digit:] | dígitos. |
[:lower:] | Letras minusculas. |
[:upper:] | Letras mayúsculas. |
Para obtener una lista completa de todas las clases de caracteres, consulte el manual de Grep .
cuantificadores
Los cuantificadores le permiten especificar el número de ocurrencias de elementos que deben estar presentes para que ocurra una coincidencia. La siguiente tabla muestra los cuantificadores soportados por GNU grep
:
El *
carácter (asterisco) coincide con el elemento anterior cero o más veces. Lo siguiente coincidirá con "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 o una coma. La .*
expresión regular coincide con cualquier número de caracteres:
grep -E '^[A-Z].*[.,]$' file.txt
El ?
carácter (signo de interrogación) hace que el elemento anterior sea opcional y solo puede coincidir una vez. Lo siguiente coincidirá tanto con "brillante" como con "derecha". El ?
carácter se escapa con una barra invertida 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
Los caracteres de llave {}
le 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 coincide con 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 “O”. El operador de alternancia |
(tubería) le permite especificar diferentes coincidencias posibles que pueden ser cadenas literales o conjuntos de expresiones. Este operador tiene la precedencia más baja de todos los operadores de expresiones regulares.
En el siguiente ejemplo, buscamos todas las apariciones de las palabras fatal
, error
y critical
en el archivo de error de registro de Nginx :
grep 'fatal\|error\|critical' /var/log/nginx/error.log
Si usa la expresión regular extendida, entonces el operador |
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 función de las expresiones regulares que le permite agrupar patrones y hacer referencia a ellos como un elemento. Los grupos se crean usando paréntesis ()
.
Cuando se usan expresiones regulares básicas, los paréntesis se deben escapar con una barra invertida ( \
).
El siguiente ejemplo coincide tanto con "sin miedo" como con "menos". El ?
cuantificador hace que el (fear)
grupo sea opcional:
grep -E '(fear)?less' file.txt
Expresiones especiales de barra invertida
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 especiales de barra invertida más comunes:
El siguiente patrón coincidirá con las palabras separadas "abyecto" y "objeto". No coincidirá con las palabras si está incrustado 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 construir expresiones regulares puede ser muy útil al buscar archivos de texto, escribir scripts o filtrar la salida de comandos.
Si tiene alguna pregunta o comentario, no dude en dejar un comentario.
0 Comentarios