Grep y expresiones regulares en Linux

Introducción

En el artículo anterior vimos una colección de filtros que manipularían los datos por nosotros. En este artículo veremos otro filtro que es bastante poderoso cuando se combina con un concepto llamado expresiones regulares o re para abreviar.

Al principio puede ser un poco difícil entenderlo, así que no te preocupes si esto es un poco confuso. Creo que el mejor enfoque es repasar el material y experimentar un poco en la línea de comandos, luego dejarlo por un día o 3, luego regresar y tener otra oportunidad.

Te sorprenderá, pero comenzarás a tener más sentido la segunda vez. Dominar las expresiones regulares solo requiere práctica y tiempo, así que no te rindas.

¿Qué son?

Las expresiones regulares son similares a los comodines que vimos en artículos anteriores. Nos permiten crear un patrón. Sin embargo, son un poco más poderosos. Las expresiones regulares generalmente se usan para identificar y manipular datos específicos. Por ejemplo, es posible que deseemos identificar cada línea que contenga una dirección de correo electrónico o una URL en un conjunto de datos.

Las expresiones regulares se utilizan en todo el lugar. Aquí las demostraremos con grep, pero muchos otros programas las usan (incluidos sed y vi que aprendiste en artículos anteriores) y muchos lenguajes de programación también las utilizan.

Te daré una introducción a ellas aquí en este artículo, pero hay mucho más que pueden hacer.

Truco

Los caracteres utilizados en las expresiones regulares son los mismos que los utilizados en los comodines. Sin embargo, su comportamiento es ligeramente diferente. Un error común es olvidar esto y mezclar sus funciones.

eGrep

egrep es un programa que buscará un conjunto de datos dado e imprimirá cada línea que contenga un patrón dado. Es una extensión de un programa llamado grep.

Su nombre es extraño, pero se basa en un comando que hizo una función similar, en un editor de texto llamado ed. Tiene muchas opciones de línea de comandos que modifican su comportamiento, por lo que vale la pena revisar su página de manual, es decir, la opción -v le dice a grep que imprima todas las líneas que no coinciden con el patrón.

egrep [opciones de línea de comandos] <patrón> [ruta]

En los ejemplos a continuación, utilizaremos un archivo de muestra similar al del último artículo. Se incluye a continuación como referencia.

Digamos que deseamos identificar cada línea que contiene la cadena mellon.

El comportamiento básico de egrep es que imprimirá la línea completa para cada línea que contenga una cadena de caracteres que coincida con el patrón dado. Es importante tener en cuenta que no estamos buscando una palabra sino una cadena de caracteres.

También ten en cuenta que incluimos el patrón entre comillas. Esto no siempre es necesario, pero es más seguro acostumbrarse a usarlas siempre. Son necesarias si tu patrón contiene caracteres que tienen un significado especial en la línea de comandos.

A veces queremos saber no solo qué líneas coinciden sino también su número de línea.

O tal vez no estamos interesados ​​en ver las líneas coincidentes, pero deseamos saber cuántas líneas coincidieron.

Aprendiendo expresiones regulares

La mejor manera de aprender expresiones regulares es probar los ejemplos tú mismo y luego modificarlos ligeramente para evaluar tu comprensión. Es común cometer errores en tus patrones mientras aprendes. Cuando esto sucede, normalmente todas las líneas coincidirán o no coincidirá ninguna línea o algún conjunto oscuro.

No te preocupes si esto sucede, no has hecho ningún daño y puedes regresar fácilmente y tener otra oportunidad. Recuerda que puedes presionar la flecha hacia arriba en tu teclado para acceder a tus comandos recientes y también modificarlos para que no necesites volver a escribir todo el comando cada vez.

Si no estás obteniendo el resultado que deseas, aquí hay algunas estrategias básicas.

  • En primer lugar, verifica si hay errores tipográficos. Si eres como yo, entonces eres propenso a hacerlos.
  • Vuelve a leer el contenido aquí. Tal vez lo que creías que hacía un operador en particular era ligeramente diferente de lo que realmente hace y, al volver a leerlo, notarás un punto que puede haberse perdido la primera vez.
  • Divide tu patrón en componentes individuales y prueba cada uno de ellos individualmente. Esto te ayudará a tener una idea de qué partes del patrón son correctas y qué partes necesitas ajustar.
  • Examina tu salida. Es posible que tu patrón actual no haya funcionado de la manera que deseas, pero aún podemos aprender de él. Ver lo que realmente coincidimos y usarlo para ayudar a comprender lo que realmente sucedió nos ayudará a determinar qué debemos intentar cambiar para acercarnos a lo que realmente queremos.

Debuggex es una herramienta en línea comandos que te permite experimentar con expresiones regulares y lte permite visualizar su comportamiento. Puede ser una buena manera de comprender mejor cómo funcionan.

Resumen de expresiones regulares

Esbozaré los bloques de construcción básicos de expresiones regulares a continuación y luego seguiré con un conjunto de ejemplos para demostrar su uso.

  • (punto): un solo carácter.
  • – el caracter anterior coincide solo 0 o 1 veces.
  • * – el caracter anterior coincide con 0 o más veces.
  • +: el caracter anterior coincide 1 o más veces.
  • {n}: el caracter anterior coincide exactamente n veces.
  • {n, m}: el caracter anterior coincide al menos n veces y no más de m veces.
  • [agd]: el caracter es uno de los incluidos entre corchetes.
  • [^ agd]: el caracter no es uno de los incluidos entre corchetes.
  •  – el guión dentro de los corchetes funciona como un rango. En este caso significa las letras c, d, e o f.
  • (): nos permite agrupar varios caracteres para que se comporten como uno solo.
  • El | (símbolo de tubería): la operación lógica OR.
  • ^: coincide con el comienzo de la línea.
  • $: coincide con el final de la línea.

Algunos ejemplos

Comenzaremos con algo simple. Digamos que deseamos identificar cualquier línea con dos o más vocales seguidas. En el siguiente ejemplo, el multiplicador {2,} se aplica al elemento anterior, que es el rango.

¿Qué tal cualquier línea con un 2 que no sea el final de la línea? En este ejemplo, el multiplicador + se aplica a que es cualquier caracter.

El número 2 como el último caracter en la línea.

Y ahora cada línea que contiene ‘is’ o ‘go’ u ‘or’.

Tal vez deseamos ver pedidos para todos cuyo nombre comienza con A – K.

Resumen

Lo que aprendimos

egrep

Ver líneas de datos que coinciden con un patrón particular.

Conceptos importantes

Expresiones regulares

Una forma poderosa de identificar partes particulares de información.

Practicando lo aprendido

Identifiquemos alguna información.

  • En primer lugar, es posible que desees crear un archivo con datos similares a nuestro archivo de muestra.
  • Ahora juega con algunos de los ejemplos que vimos anteriormente.
  • Echa un vistazo a la página de manual de egrep y prueba al menos 2 de las opciones de línea de comandos para ellos.