Y aquí el script:
Código: Seleccionar todo
#!/bin/bash
# ==============================================================================
# Script de filtrado de IPs y rangos en logs de acceso
# Publicado en Indaga.net
# ==============================================================================
# Validar que se introduzcan los argumentos necesarios
if [ "$#" -ne 2 ]; then
echo "Error: Argumentos insuficientes."
echo "Uso: $0 <log_origen> <log_destino>"
exit 1
fi
LOG_ORIGEN="$1"
LOG_DESTINO="$2"
# Verificar la existencia del archivo de origen
if [ ! -f "$LOG_ORIGEN" ]; then
echo "Error: El archivo '$LOG_ORIGEN' no existe."
exit 1
fi
# Definición de reglas y rangos a excluir (formato Regex)
PATRONES=(
"192\.168\.1\." # Subred 192.168.1.0/24
"10\.0\." # Subred 10.0.0.0/16
"172\.16\.0\.[0-9]\b" # IPs del 172.16.0.0 al 172.16.0.9
"172\.16\.0\.1[0-9]\b" # IPs del 172.16.0.10 al 172.16.0.19
"203\.0\.113\.45" # Dirección IP única estática
)
# Unir el array de patrones utilizando la barra vertical (|) como separador OR
PATRON_REGEX=$(IFS='|'; echo "${PATRONES[*]}")
# Ejecución del filtrado con grep
grep -v -E "$PATRON_REGEX" "$LOG_ORIGEN" > "$LOG_DESTINO"
RESULTADO=$?
# Confirmación de salida
# grep devuelve: 0 = hubo líneas tras filtrar, 1 = ninguna línea coincidió
# (log resultante vacío, no es un error), 2 = error real (lectura, etc.)
if [ "$RESULTADO" -le 1 ]; then
echo "Filtrado completado con éxito."
echo "Archivo limpio guardado en: $LOG_DESTINO"
else
echo "Ocurrió un error al procesar el archivo."
fi