Introducción a grep

G/er/p

Lo prometido es deuda. En el artículo anterior, hice la promesa que regresaría con más información para desempolvar los dedos. Esta vez hablaré un poco de cómo construir expresiones regulares (aka regex) para la extracción de información. Para lo siguiente, el consejo que le doy a los novatos es que consideren 4 cosas al momento de realizar la construcción de sus búsquedas y probarlas. Es importante asegurarse que los datos que están observando son realmente todos los que son y que éstos no se ven sesgados por datos de otra clase.

Las premisas que en todos los casos deben ser ciertas son:
  1. Qué empata.
  2. Qué NO empata.
  3. Qué empata pero No debería empatar.
  4. Qué no empata, pero debería empatar.

Insisto en la importancia de mantener la consistencia en los resultados. Si vamos a presentar un informe con fechas, números, promedios y picos; cualquier volumen de datos podría generar una desviación en la verosimilitud de toda la información, poniendo en riesgo las medidas futuras a tomar.

Expresiones Regulares


Esta es una de las fortalezas de las utilidades como grep, awk y sed. Son similares la conformación de regex en cada uno, sin embargo, algunas veces existen sus diferencias, incluso entre las distintas implementaciones de cada uno, dependiendo del vendedor.

El funcionamiento general es:

grep "string|regex" archivos|strings


Pasemos a la práctica. Lo primero que haremos será hacer unas búsquedas sencillas. En medida que entremos en las expresiones iré explicándolas. Al final de este post encontrará la liga de descarga del archivo utilizado para los ejemplos en estas entregas.

# Mostrar la cabecera que contenta el ISBN

grep "ISBN" goodreads_library_export.csv

Este resultado nos arrojará la siguiente línea.

Book Id,Title,Author,Author l-f,Additional Authors,ISBN,ISBN13,My Rating,Average Rating,Publisher,Binding,Number of Pages,Year Published,Original Publication Year,Date Read,Date Added,Bookshelves,Bookshelves with positions,Exclusive Shelf,My Review,Spoiler,Private Notes,Read Count,Recommended For,Recommended By,Owned Copies,Original Purchase Date,Original Purchase Location,Condition,Condition Description,BCID

Consideraciones. La anterior ejecución NO trae las líneas que contengan las palabras isbn, debido a que grep distingue entre mayúsculas y minúsculas. También se observa que la salida coincide con una "palabra" que tiene además el 13. Es porque la evaluación se realiza carácter por carácter, no por cadenas de caracteres.

# Mostrar las fechas con distintos delimitadores.

grep "[0-9][0-9][0-9][0-9][-/][0-3][0-9][-/][0-9][0-9]" goodreads_library_export.csv


Consideraciones. Buscamos todas las fechas en con delimitadores '-' o '/'. Aquí se tiene que ser muy claro en el orden de aparición, siempre, cuando se vaya a utilizar el guión como delimitador debe ir al inicio de la expresión '[-]', de lo contrario, grep lo interpretará como un Character Class. Si hay fechas absurdas como 9999/39/99 será válida para la expresión.

[0-9] -> Evalúa un rango del 0 al 9 en un sólo carácter.


Tip. Cuidado con las condiciones de zero or more matches. Esto quiere decir que son válidas aún cuando no traigan resultados. Un caso de estos es el modificador '*' que no funciona como todo el mundo cree, especialmente los que saben que en bash es un 'todos'. Abordaremos este metacaracter en la siguiente entrega.


Para estos ejemplos utilizaremos el archivo de goodread que podemos descargar.

Comentarios

Entradas populares de este blog

Análisis de conexiones TIME_WAIT

Agregar un usuario a un grupo secundario

Desencriptar passwords AES y DES en WebLogic 10