2010-11-16 1 views
1

Вот ситуация, я написал небольшой скрипт для создания списка IP-адресов, с которых электронная почта была отвергнута:Добавление новых записей из Баш массива в текстовый файл

msgid_array=($(grep ' sendmail\[' /var/log/maillog | 
       egrep -v 'stat=(Sent|queued|Please try again later)' | 
       egrep dsn='5\.[0-9]\.[0-9]' | awk '{print $6}')) 

for z in ${msgid_array[@]}; do 
    ip_array[x++]=$(grep $z /var/log/maillog | egrep -m 1 -o 'relay=.*' | 
        egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}') 
done 

Так что это делает он ищет все идентификаторы сообщений отклоненных сообщений электронной почты и сохраняет их в файле msgid_array.

Затем, используя цикл for, grep представляет собой maillog с каждым идентификатором сообщения и отфильтровывает IP-адрес отправителя и сохраняет все IP-адреса в ip_array.

Теперь я намереваюсь запускать это каждый день и позволяю ему анализировать записи журнала за вчерашний день, а затем сохранять результаты в отдельном файле txt.

Если у меня есть запись "reject_ip_addresses =" в моем txt-файле, как я могу просто добавить новые IP-адреса в существующий список?

Итак, сегодня я запускаю его и запись выглядит следующим образом:

rejected_ip_adresses=1.1.1.1 2.2.2.2 

Завтра, когда я запускаю это массив выглядит так, потому что одни и те же 2 отправителей были проблемы с отправкой по электронной почте, но есть 2 новых из них:

ip_array=(1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4) 

Так моя запись в формате TXT должен выглядеть следующим образом, точка существо имея ежемесячный обзор всех проблемных адресов:

rejected_ip_adresses=1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4 

Спасибо за любые идеи, в настоящее время мой мозг отказывается мне помочь.

ответ

1

Я хотел бы добавить записи, по одному в каждой строке, в файл и сделать sort -u:

printf "%s\n" ${ip_array[@]} >> problem_ips.txt 
sort problem_ips.txt > tmp.txt && mv tmp.txt problem_ips.txt 

Вы можете ускорить процесс значительно заменив свой цикл с:

ip_array=($(printf "%s\n" ${msgid_array[@]} | grep -f - /var/log/maillog ...)) 

Вы также можете получить небольшое увеличение скорости, заменив несколько вызовов на grep одним вызовом на awk, который выполняет те же операции. Однако наибольший выигрыш будет заключаться в удалении этого цикла, где все эти greps вызываются много раз.

+0

Я думал об использовании сорта -u, просто не понял оптимального подхода, это кажется простым и функциональным, и спасибо за оптимизацию, я всегда получаю отличный ответ от вас. Dennis :) – f10bit

+0

Сортировка команда может быть упрощена с помощью ключа -o, поэтому строка будет выглядеть так: sort -u problem_ips.txt -o problem_ips.txt – f10bit

0

Возможно, у вас могут быть пары имени и значения (я имею в виду переменные), которые вы можете использовать в своем скрипте. Опять же, прежде чем выйти из скрипта, вы можете снова создать пару имени и значения.

Example: 

Variables.conf 
    rejected_ip_adresses=1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4 
    [email protected] 
    [email protected] 

parse.sh 
    source variable.conf 
    . 
    . 
    . 
    <parsing logic> 
    . 
    . 
    . 
    . 
    <loop to store the variables back>