Curso de Shell Scripting
El procesamiento de texto es uno de los puntos fuertes de los scripts en shell. Permite automatizar tareas como buscar patrones, extraer columnas o transformar datos masivos de manera rápida y eficiente.
8.1. Herramientas principales
| Herramienta | Uso principal |
|---|---|
grep | Buscar líneas que coincidan con un patrón |
sed | Editar texto en flujo (buscar, reemplazar) |
awk | Procesar datos por campos y hacer cálculos |
cut | Extraer columnas o campos |
sort | Ordenar líneas |
uniq | Quitar duplicados o contarlos |
tr | Sustituir o eliminar caracteres |
wc | Contar líneas, palabras o bytes |
head/tail | Ver el inicio o final de archivos |
join | Unir dos archivos por una columna común |
comm | Comparar líneas comunes o diferentes |
8.2. grep: buscar texto por patrones
Búsqueda básica:
1grep "ERROR" logs.txt
Con resaltado de colores y número de línea:
1grep -n --color=auto "ERROR" logs.txt
Búsqueda recursiva en carpetas:
1grep -r "FATAL" /var/log
Ignorar mayúsculas:
1grep -i "error" logs.txt
Contar coincidencias:
1grep -c "ERROR" logs.txt
8.3. sed: buscar y reemplazar
Reemplazar la primera aparición de un patrón por línea:
1sed 's/ERROR/ALERTA/' logs.txt
Reemplazar todas las apariciones:
1sed 's/ERROR/ALERTA/g' logs.txt
Editar el archivo en el sitio (¡con cuidado!):
1sed -i 's/ERROR/ALERTA/g' logs.txt
Eliminar líneas que contengan un patrón:
1sed '/DEBUG/d' logs.txt
8.4. awk: procesar texto por columnas
awk divide cada línea en campos usando separadores (por defecto espacio/tabulador).
Ejemplo: mostrar la primera columna de un archivo CSV (separado por comas):
1awk -F',' '{print $1}' datos.csv
Mostrar segunda y tercera columna con un guion:
1awk -F',' '{print $2 "-" $3}' datos.csv
Sumar valores de la segunda columna:
1awk -F',' '{suma += $2} END {print "Total:", suma}' datos.csv
Filtrar filas con condición:
1awk -F',' '$3 > 50 {print $1, $3}' datos.csv
8.5. cut: extraer campos
Extraer primeras 10 letras de cada línea:
1cut -c1-10 archivo.txt
Extraer segunda columna de CSV (separador ,):
1cut -d',' -f2 archivo.csv
8.6. sort y uniq
Ordenar un archivo de texto:
1sort nombres.txt
Orden descendente:
1sort -r nombres.txt
Eliminar duplicados (requiere ordenar primero):
1sort nombres.txt | uniq
Contar cuántas veces aparece cada línea:
1sort nombres.txt | uniq -c
8.7. tr: transformar caracteres
Convertir minúsculas a mayúsculas:
1tr 'a-z' 'A-Z' < archivo.txt
Eliminar dígitos:
1tr -d '0-9' < archivo.txt
8.8. wc: contar líneas, palabras y bytes
Contar líneas:
1wc -l archivo.txt
Contar palabras:
1wc -w archivo.txt
Contar caracteres:
1wc -c archivo.txt
8.9. head y tail: mostrar partes de un archivo
Primeras 5 líneas:
1head -n 5 archivo.txt
Últimas 10 líneas:
1tail -n 10 archivo.txt
Monitorizar un archivo en tiempo real (por ejemplo logs):
1tail -f /var/log/syslog
8.10. Ejemplo integrador: pipeline
Supongamos un archivo access.log con entradas tipo:
192.168.0.1 GET /index.html 200
192.168.0.2 GET /contact.html 404
192.168.0.1 GET /about.html 200
Contar cuántas peticiones hizo cada IP:
1awk '{print $1}' access.log | sort | uniq -c | sort -nr
Salida:
2 192.168.0.1
1 192.168.0.2
🏋️♂️ Ejercicio práctico 1
Crea un script llamado analiza_logs.sh que:
- Busque en todos los
.logdel directorio actual las líneas con “ERROR” usandogrep. - Reemplace la palabra “ERROR” por “ALERTA” en la salida (sin modificar los archivos originales) usando
sed. - Cuente cuántas líneas se encontraron usando
wc -l. - Muestre un resumen con el total de alertas.
🏋️♂️ Ejercicio práctico 2
Tienes un archivo ventas.csv con el formato:
Producto,Cantidad,Precio
Libro,3,15
Lapiz,10,1
Cuaderno,5,2
Crea un script calcula_ingresos.sh que:
- Ignore la primera línea (encabezado) con
tail -n +2. - Calcule
Cantidad * Preciode cada fila usandoawk. - Muestre el ingreso total.
Salida esperada:
Ingreso total: 65
✅ Buenas prácticas
- ✅ Usa
grep -Eoawkpara patrones complejos. - ✅ Con datos grandes, encadena comandos con
|para evitar archivos temporales. - ✅ Comprueba el separador correcto en CSV con
-Fenawko-dencut. - ✅ Prueba los comandos por separado antes de integrarlos en un script.
- Loading...