将bash数组中的新条目附加到txt文件

时间:2010-11-16 05:02:04

标签: arrays bash append text-files

在这种情况下,我写了一个小脚本来生成拒绝电子邮件的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

所以它做的是查找被拒绝的电子邮件的所有消息ID并将它们存储在msgid_array中。

然后使用for循环,grep是带有每个消息ID的maillog,并过滤掉发件人的IP地址,并将所有IP存储在ip_array中。

现在我打算每天运行它并让它解析昨天的日志条目,然后将结果存储在一个单独的txt文件中。

如果我的txt文件中有“rejected_ip_addresses =”条目,我怎么能简单地将任何新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

感谢任何想法,目前我的大脑拒绝帮助我。

2 个答案:

答案 0 :(得分: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被多次调用的循环。

答案 1 :(得分:0)

可能你可以拥有名称和值对(我的意思是变量),你可以将它们输入到你的脚本中。退出脚本之前,您可以再次重新创建名称和值对。

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>