Grep y Regex: ¿Cómo usarlos de manera efectiva?

Si ha estado usando Linux por un tiempo, ya conoce grep (Global Regular Expression Print), una herramienta de impresión de texto.processHerramienta de búsqueda que puede utilizar para buscar archivos y directorios. Es muy útil en manos de un usuario avanzado de Linux. Sin embargo, usarlo sin expresiones regulares puede limitar sus capacidades.
Pero, ¿qué es Regex?
Regex son expresiones regulares que puede usar para mejorar la funcionalidad de búsqueda de grep. Regex, por definición, es un patrón de filtrado de salida avanzado. Con la práctica, puede usar expresiones regulares de manera efectiva, ya que también puede usarlas con otros comandos de Linux.
En nuestro tutorial, aprenderemos cómo usar Grep y Regex de manera efectiva.
Requisito previo
El uso de grep con expresiones regulares requiere un buen conocimiento de Linux. Si eres un principiante, echa un vistazo a nuestro guías de linux.
También necesita acceso a una computadora portátil o computadora que ejecute el sistema operativo Linux. Puedes usar cualquier Distribución de Linux de su elección. Y, si tienes un Windows máquina, aún puedes usar Linux con WSL2. Echa un vistazo a nuestra versión detallada al respecto. Haga clic aquí para entrar..
El acceso a la línea de comando/terminal le permite ejecutar todos los comandos proporcionados en nuestro tutorial de grep/regex.
Además, también necesita acceso a los archivos de texto que necesitará para ejecutar los ejemplos. Usé ChatGPT para generarate una pared de texto, diciéndole que escriba sobre tecnología. El mensaje que utilicé es el siguiente.
“Generoate 400 palabras sobre tecnología. Debería incluir la mayor parte de la tecnología. Además, asegúrese de repetir los nombres de las tecnologías en todo el texto”.
Una vez que genereateDespués de editar el texto, lo copié, lo pegué y lo guardé en el archivo tech.txt, que usaremos a lo largo del tutorial.
Por último, una comprensión básicaandiLa ejecución del comando grep es imprescindible. Puedes consultar 16 ejemplos de comandos grep para refrescar tus conocimientos. También presentaremos brevemente el comando grep para que pueda comenzar.
Sintaxis y ejemplos del comando grep
La grep La sintaxis del comando es simple.
$ grep -options [regex/pattern] [files]
Como puede notar, espera un patrón y la lista de archivos que desea ejecutar el comando.
Hay muchas opciones de grep disponibles que modifican su funcionalidad. Éstas incluyen:
- - i: ignorar casos
- -r: hacer búsqueda recursiva
- -w: realizar una búsqueda para encontrar solo palabras completas
- -v: mostrar todas las líneas que no coinciden
- -norte: mostrar todos los números de línea coincidentes
- -l: imprimir los nombres de los archivos
- -color: salida de resultados en color
- -C: muestra el recuento de coincidencias para el patrón utilizado
#1. Buscar una palabra completa
Deberá usar el argumento -w con grep para una búsqueda de palabra completa. Al usarlo, omite cualquier cadena que coincida con el patrón dado.
$ grep -w ‘tech\|5G’ tech.txt

Como puede ver, el comando da como resultado una salida en la que busca dos palabras, "5G" y "tecnología", en todo el texto. Luego los marca con color rojo.
Aquí, el | el símbolo de tubería tiene escape para que grep no lo haga process como un metacarácter.
#2. Búsqueda que no distingue entre mayúsculas y minúsculas
Para hacer una búsqueda que no distinga entre mayúsculas y minúsculas, use grep con el -i argumento.
$ grep -i ‘tech’ tech.txt

El comando busca cualquier instancia de la cadena "tech" que no distinga entre mayúsculas y minúsculas, ya sea una palabra completa o parte de ella.
#3. Hacer una búsqueda de línea no coincidente
Para mostrar todas las líneas que no contienen un patrón determinado, deberá utilizar el -v argumento.
$ grep -v ‘tech’ tech.txt

La salida muestra todas las líneas que no contienen la palabra "tecnología.” También verá líneas vacías también. Estas líneas son las líneas que están después de un párrafo.
#4. Haz una búsqueda recursiva
Para realizar una búsqueda recursiva, utilice el -r argumento con grep.
$ grep -R ‘error\|warning’ /var/log/*.log
#output
/var/log/bootstrap.log:2023-01-03 21:40:18 URL:http://ftpmaster.internal/ubuntu/pool/main/libg/libgpg-error/libgpg-erro 0_1.43-3_amd64.deb [69684/69684] -> "/build/chroot//var/cache/apt/archives/partial/libgpg-error0_1.43-3_amd64.deb" [1]
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':
/var/log/bootstrap.log:dpkg: warning: ignoring pre-dependency problem!

El comando grep busca recursivamente dos palabras, "error" y "advertencia", en el directorio /var/log. Este es un comando útil para obtener información sobre cualquier advertencia y error en los archivos de registro.
Grep y Regex: qué es y ejemplos
Como estamos trabajando con expresiones regulares, debe saber que las expresiones regulares ofrecen tres opciones de sintaxis. Éstas incluyen:
- Expresiones regulares básicas (BRE)
- Expresiones regulares extendidas (ERE)
- Expresiones regulares compatibles con Pearl (PCRE)
El comando grep usa BRE como la opción predeterminada. Por lo tanto, si desea utilizar otros modos de expresión regular, deberá mencionarlos. El comando grep también trata los metacaracteres como son. Por lo tanto, si usa metacaracteres como ?, +, ), deberá escapar de ellos con el comando de barra invertida (\).
La sintaxis de grep con expresiones regulares es la siguiente.
$ grep [regex] [filenames]
Veamos grep y regex en acción con los siguientes ejemplos.
#1. Coincidencias de palabras literales
Para hacer una coincidencia de palabra literal, deberá proporcionar una cadena como expresión regular. Después de todo, una palabra también es una expresión regular.
$ grep "technologies" tech.txt

De manera similar, también puede usar coincidencias literales para encontrar usuarios actuales. Para ello, corre,
$ grep bash /etc/passwd
#output
root:x:0:0:root:/root:/bin/bash
nitt:x:1000:1000:,,,:/home/nitt:/bin/bash

Esto muestra los usuarios que pueden acceder al bash.
#2. Coincidencia de anclas
La coincidencia de anclas es una técnica útil para búsquedas avanzadas que utilizan caracteres especiales. En expresiones regulares, hay diferentes caracteres de anclaje que puede usar para representar posiciones específicas dentro de un texto. Éstas incluyen:
- "^' símbolo de intercalación: El símbolo de intercalación coincide con el inicio de la cadena o línea de entrada y busca una cadena vacía.
- "símbolo de dólar $': El símbolo del dólar coincide con el final de la cadena o línea de entrada y busca una cadena vacía.
Los otros dos caracteres de coincidencia de anclaje incluyen el límite de palabra '\ b' y el límite de no palabra '\ B'.
- Límite de palabra '\ b': Con \b, puede afirmar la posición entre una palabra y un carácter que no es una palabra. En palabras simples, te permite hacer coincidir palabras completas. De esta manera, puede evitar coincidencias parciales. También puede usarlo para reemplazar palabras o contar las apariciones de palabras en una cadena.
- \B límite sin palabra: Es lo opuesto a \b word border en expresiones regulares, ya que afirma una posición que no está entre dos palabras o caracteres que no son palabras.
Veamos ejemplos para tener una idea clara.
$ grep ‘^From’ tech.txt

El uso de intercalación requiere ingresar la palabra o el patrón en el caso correcto. Eso es porque distingue entre mayúsculas y minúsculas. Entonces, si ejecuta el siguiente comando, no devolverá nada.
$ grep ‘^from’ tech.txt
De manera similar, puede usar el símbolo $ para encontrar la oración que coincida con un patrón, cadena o palabra dados.
$ grep ‘technology.$' tech.txt

También puede combinar los símbolos ^ y $. Veamos el ejemplo a continuación.
$ grep “^From \| technology.$” tech.txt

Como puede ver, la salida contiene oraciones que comienzan con "De" y oraciones que terminan con "tecnología".
#3. Agrupamiento
Si desea buscar varios patrones a la vez, deberá utilizar Agrupación. Te ayuda a crearate pequeños grupos de personajes y patrones que puedes tratar como una sola unidad. Por ejemplo, puedes crearate un grupo (tecnología) que incluye el término 't', 'e', 'c',' h.'
Para tener una idea clara, veamos un ejemplo.
$ grep 'technol\(ogy\)\?' tech.txt

Con la agrupación, puedes hacer coincidir la repetición.ateBuscar patrones, capturar grupos y buscar alternativas.
Búsqueda alternativa con agrupación
Veamos un ejemplo de búsqueda alternativa.
$ grep "\(tech\|technology\)" tech.txt

Si desea realizar una búsqueda en una cadena, deberá pasarla con el símbolo de tubería. Veámoslo en el siguiente ejemplo.
$ echo “tech technological technologies technical” | grep "\(tech\|technology\)"
#output
“tech technological technologies technical”

Grupos de captura, grupos de no captura y repeticiónatePatrones
¿Y qué pasa con los grupos de captura y no captura?
Necesitarás crearate un grupo en la expresión regular y pasarlo a la cadena o un archivo para capturar grupos.
$ echo 'tech655 tech655nical technologies655 tech655-oriented 655' | grep "\(tech\)\(655\)"
#output
tech655 tech655nical technologies655 tech655-oriented 655

Y, para los grupos que no capturan, deberá usar el ?: entre paréntesis.
Por último, tenemos repatepatrones d. Deberá modificar la expresión regular para verificar la repetición.atepatrones d.
$ echo ‘teach tech ttrial tttechno attest’ | grep '\(t\+\)'
#output
‘teach tech ttrial tttechno attest’
Aquí, la expresión regular busca una o más instancias del carácter 't'.
#4. Clases de personajes
Con las clases de caracteres, puede escribir expresiones regulares fácilmente. Estas clases de caracteres utilizan square soportes. Algunas de las clases de personajes más conocidas incluyen:
- [:dígito:] – 0 a 9 dígitos
- [:alfa:] - caracteres alfabéticos
- [: alnum:] - caracteres alfanuméricos
- [:más bajo:] - letras minusculas
- [:superior:] - letras mayúsculas
- [: xdigit:] – dígitos hexadecimales, incluidos 0-9, AF, af
- [:blanco:] – caracteres en blanco como tabulador o espacio
¡Y así!
Veamos algunos de ellos en acción.
$ grep [[:digit]] tech.txt

$ grep [[:alpha:]] tech.txt

$ grep [[:xdigit:]] tech.txt

#5. Cuantificadores
Los cuantificadores son metacaracteres y están en el centro de expresiones regulares. Estos le permiten hacer coincidir las apariencias exactas. Veámoslos a continuación.
- * → Zero o más coincidencias
- + → una o más coincidencias
- ? → Zero o uno coincide
- {X} → x coincidencias
- {X, } → x o más coincidencias
- {x, z} → de x a z coincide
- {,z} → hasta z coincidencias
$ echo ‘teach tech ttrial tttechno attest’ | grep -E 't+'
#output
‘teach tech ttrial tttechno attest’
Aquí, busca el 't ' instancias de caracteres para una o más coincidencias. Aquí -E significa expresión regular extendida (que discutiremos later.)

#6. Regex extendido
Si no le gusta agregar caracteres de escape en el patrón de expresiones regulares, debe usar expresiones regulares extendidas. Elimina la necesidad de agregar caracteres de escape. Para hacerlo, deberá usar el indicador -E.
$ grep -E 'in+ovation' tech.txt

#7. Uso de PCRE para realizar búsquedas complejas
PCRE (expresión regular compatible con Perl) le permite hacer mucho más que escribir expresiones básicas. Por ejemplo, puede escribir "\d" que denota [0-9].
Por ejemplo, puede usar PCRE para buscar direcciones de correo electrónico.
echo "Contact me at nitish@newdomain.com" | grep -P "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b"
#output
Contact me at nitish@newdomain.com

Aquí, PCRE garantiza que el patrón coincida. De manera similar, también puede usar un patrón PCRE para verificar date .
$ echo "The Sparkain site launched on 2023-07-29" | grep -P "\b\d{4}-\d{2}-\d{2}\b"
#output
The Sparkain site launched on 2023-07-29

El comando encuentra la date in AAAA-MM-DD formato. Puedes modificarlo para que coincida con otros d.ate formato también.
#8. Alternancia
Si desea coincidencias alternativas, puede utilizar los caracteres de canalización con escape (\|).
$ grep -L ‘warning\|error’ /var/log/*.log
#output
/var/log/alternatives.log
/var/log/bootstrap.log
/var/log/dpkg.log
/var/log/fontconfig.log
/var/log/ubuntu-advantage.log
/var/log/upgrade-policy-changed.log
El resultado enumera los nombres de archivo que contienen "advertencia" o "error".

Palabras finales
Esto nos lleva al final de nuestra guía grep y regex. Puede utilizar grep con expresiones regulares ampliamente para refinar las búsquedas. Con un uso correcto, puede ahorrar mucho tiempo y ayudar a automatizarate muchas tareas, especialmenteally si los está utilizando para escribir scripts o utilizar la expresión regular al realizar búsquedas en el texto.
A continuación, echa un vistazo preguntas y respuestas frecuentes de la entrevista de Linux.