Добавить новые записи из массива bash в текстовый файл - PullRequest
1 голос
/ 16 ноября 2010

Вот ситуация, я написал небольшой скрипт для генерации списка 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 создает почтовый журнал с каждым идентификатором сообщения, отфильтровывает IP-адрес отправителя и сохраняет все IP-адреса в ip_array.

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

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

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

rejected_ip_adresses=1.1.1.1 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

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

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

Я бы добавил записи, по одной на строку, в файл и сделал бы 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 голосов
/ 16 ноября 2010

вероятно, вы можете иметь пары имя и значение (я имею в виду переменные), которые вы можете использовать в своем скрипте. Снова перед выходом из сценария вы можете заново создать пару имя-значение.

Example:

Variables.conf
  rejected_ip_adresses=1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4
  from_email=test@test.com
  to_email=test@test.com

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