Ich brauche Hilfe mit diesem Skript. Dieses Skript analysiert apache_access.log durch eine filter.txt. Wenn der Begriff im Filter vorhanden ist, wird das Skript etwas tun. Mein Problem liegt meiner Meinung nach im ersten Befehl „for“, ich kann den Filter nicht zeilenweise verwenden.
kann mir jemand helfen?
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
Antwort1
Dumöchte keine Zeilen lesen mitfor
. Verwenden Sie stattdessen while
und read
. Das Problem besteht darin, dass die Shell Argumente bei Leerzeichen aufteilt, sodass jedes Leerzeichen in der Zeile der Protokolldatei tatsächlich dazu führt, dass die Schleife ein weiteres Mal ausgeführt wird.
tail -n $LINESTOSEARCH $IPEATERFILTER | while read -r line; do
# do something with "$line"
done
Wiederholen Sie dasselbe Muster für die inneren Schlaufen.