Apuntes bash

No es un bug, es una característica del shell.

Expresiones regulares en la Shell

Las expresiones regulares son una sintaxis formal para definir patrones de texto. Son como un mini-lenguaje que te permite describir secuencias de caracteres que quieres buscar, coincidir o manipular. Este lenguaje es universal y se implementa en casi todos los lenguajes de programación (Python, Java, JavaScript, Perl, Ruby, C#, PHP etc.) y en muchas herramientas de línea de comandos.

Por su parte, grep, sed y AWK son programas independientes que bash puede ejecutar, capturar su salida y manipularla. Las tres usan expresiones regulares, pero aunque todas ellas están basadas en el standard POSIX, su implementación no es idéntica

Metacaracteres, Patrones y Procesamiento de Texto en Bash

Los metacaracteres y patrones, como los usados en expresiones regulares (regex), se utilizan para buscar, filtrar y manipular texto. Los programas grep, sed, y awk son esenciales para estas tareas, cada uno con un propósito específico. Aqui vamos a ver lo mas esencial de las expresiones regulares, y cual es la utilidad de estos programas, en relación con bash>

La idea general que subyace en las expresiones regulares de cualquier lenguaje es la de comparar un patrón abstracto (aguja) con una cadena de caracteres (pajar) y encontrar coincidencias.

Los metacaracteres comunes incluyen:

  • .: Coincide con cualquier carácter.
  • *: Coincide con cero o más repeticiones del carácter anterior.
  • ^: Coincide con el inicio de una línea.
  • $: Coincide con el final de una línea.
  • [ ]: Coincide con un conjunto de caracteres. Por ejemplo, [aeiou] coincide con cualquier vocal, [0-9] coincide con cualquier dígito, [a-z] con cualquier letra minúscula.
  • -: Se usa dentro de [ ] para definir un rango (por ejemplo, [a-z] coincide con cualquier letra minúscula).

Nota: Algunos comandos requieren regex extendidas (con -E en grep o -r en sed) para metacaracteres avanzados como + o |.

Propósito de grep

grep (Global Regular Expression Print) se usa para buscar y filtrar líneas que coincidan con un patrón en archivos o en la entrada estándar. Es ideal para analizar logs o encontrar texto específico.

Ejemplo: Buscar líneas con "error" en un archivo de log:


# Crear un archivo de ejemplo
echo -e "Info: Sistema iniciado\nError: Conexión fallida\nInfo: Proceso completado" > log.txt
# Buscar "error" (ignorando mayúsculas/minúsculas)
grep -i "error" log.txt

Salida: Error: Conexión fallida

  • Usa -i para ignorar mayúsculas/minúsculas
  • -E para patrones avanzados (por ejemplo, grep -E '[0-9]+' (que busca uno o más dígitos).
  • -v invierte la búsqueda, mostrando las líneas que NO coinciden con el patrón.
  • -c cuenta el número de líneas que coinciden.

Propósito de sed

sed (Stream Editor) permite transformar texto de forma automatizada, como reemplazar palabras, eliminar líneas o modificar contenido. Es útil para editar flujos de texto sin abrir archivos manualmente.

Ejemplo: Reemplazar "error" por "fallo" en el archivo:


        sed 's/error/fallo/gi' log.txt
        # La 'g' es importante para reemplazar TODAS las ocurrencias en la línea

Salida: Muestra el archivo con "error" reemplazado por "fallo". Para guardar los cambios:


        sed 's/error/fallo/gi' log.txt > log_modificado.txt
        cat log_modificado.txt # Para ver el contenido del nuevo archivo
  • La sintaxis básica para sustitución es: s/patrón/reemplazo/modificadores
  • s indica una operación de sustitución
  • / es el delimitador por defecto, pero puedes usar otros si tu patrón o reemplazo contienen / (por ejemplo, sed 's#patrón#reemplazo#').
  • g (global) reemplaza todas las ocurrencias del patrón en cada línea, no solo la primera.
  • i (case-insensitive) ignora mayúsculas/minúsculas en el patrón.
  • -i modifica el archivo original. Si usas sed -i.bak 's/...' file, creará una copia de seguridad file.bak antes de modificar file.

Propósito de awk

awk es una herramienta para procesar y analizar texto estructurado, como archivos CSV o tablas. Divide el texto en campos según un separador, permitiendo extraer columnas, realizar cálculos o formatear datos.

Ejemplo: Extraer la segunda columna de un archivo CSV:


# Crear un archivo CSV
echo -e "nombre,edad\nAna,25\nJuan,30" > datos.csv
# Extraer la columna de edad
awk -F',' '{print $2}' datos.csv

Salida: edad\n25\n30

  • -F'DELIMITADOR' define el **separador de campos**. Si no lo especificas, awk usa espacios o tabulaciones por defecto.
  • {print $N}: Imprime el campo N
  • $0: Representa la línea completa.
  • Puedes combinar condiciones con acciones: awk 'CONDICION {ACCION}'
  • BEGIN { ... }: Código que se ejecuta antes de procesar la primera línea.
  • END { ... }: Código que se ejecuta después de procesar la última línea.

Ejemplos prácticos de búsqueda y manipulación de texto

Los siguientes ejemplos combinan grep, sed, y awk con patrones para tareas comunes.

Ejemplo 1: Filtrar y transformar texto


# Filtrar líneas con números y reemplazar comas por guiones
grep '[0-9]' datos.csv | sed 's/,/-/g'

Salida: nombre-edad\nAna-25\nJuan-30

Ejemplo 2: Procesar datos estructurados con condiciones


        # awk -F',' : Usa coma como separador de campos
# '$2 > 25' : Esta es la condición (el segundo campo es mayor que 25)
# '{print $1}' : Si la condición es verdadera, imprime el primer campo
awk -F',' '$2 > 25 {print $1}' datos.csv

Salida: Juan

Ejemplo 3: Combinar comandos


# Buscar líneas con números y extraer el primer campo
grep '[0-9]' datos.csv | awk -F',' '{print $1}'

Salida: nombre\nAna\nJuan

Nota: Usa man grep, man sed, o man awk para más detalles. Combina estos comandos en scripts para automatizar tareas complejas.

TOP