Мне нужна помощь с этим скриптом. Этот скрипт анализирует apache_access.log через filter.txt, если существует термин в фильтре, скрипт что-то сделает. Моя проблема, я думаю, в первой команде "для", я не могу использовать фильтр построчно.

Кто-нибудь может мне помочь?

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

1 ответ1

1

Вы не хотите читать строки с for. Используйте while и read вместо. Проблема заключается в том, что оболочка будет разбивать аргументы на пустое пространство, поэтому любое пространство в строке файла журнала фактически приведет к запуску цикла в другой раз.

tail -n $LINESTOSEARCH $IPEATERFILTER | while read -r line; do
    # do something with "$line"
done

Повторите ту же схему для внутренних петель.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .