Bash-Skript analysiert Apache-Protokoll

Bash-Skript analysiert Apache-Protokoll

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 whileund 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.

verwandte Informationen