Necesito ayuda con este script. Este script analiza apache_access.log a través de un filter.txt, si existe el término en el filtro, el script hará algo. Creo que mi problema está en el primer comando "para", no puedo usar el filtro línea por línea.
¿alguien me puede ayudar?
for term in `tail -n $LINESTOSEARCH $IPEATERFILTER`
do
for ip in `tail -n $LINESTOSEARCH $LOGFILE | grep "$TERM" | awk "{print \\$1}" | sort | uniq -c | sort -rn | head -20 | awk "{if (\\$1 > $THRESHOLD) print \\$2}"`
do
# Look in iptables to see if this IP is already banned
if ! iptables -L INPUT -n | grep -q $ip
then
# Do something
fi
done
done
Respuesta1
TúNo quiero leer líneas confor
. Utilice while
y read
en su lugar. El problema es que el shell dividirá los argumentos en espacios en blanco, por lo que cualquier espacio en la línea del archivo de registro hará que el bucle se ejecute en otro momento.
tail -n $LINESTOSEARCH $IPEATERFILTER | while read -r line; do
# do something with "$line"
done
Repita el mismo patrón para los bucles internos.