如何从文本文件一次增加一行并将输出sed到另一个文件?

时间:2015-06-04 01:07:07

标签: bash sed

我有一个包含例如:

的文本文件
user0@domain.com
user1@domain.com
user2@domain.com
user3@domain.com

和ssmtp.conf包含:

AuthUser=user0@domain.com

我怎样才能在第一行和sed ssmtp.conf结束这一点:

AuthUser=user1@domain.com

我需要它睡几秒钟然后换到

AuthUser=user2@domain.com

等等。目前,在这里的几个用户的帮助下,这就是我所拥有的:

#!/bin/bash
y=4 
for (( x=1; x<=y; x++ )); do
emails=`echo  $( cat /home/apx/Desktop/emailaddresses.txt | sed -n ''$x''p )`
sed -i "/AuthUser/s/= .*/= $emails/" /etc/ssmtp/ssmtp.conf
ssmtp blahh@blahh.com -v < /home/apx/Desktop/message.txt
sleep 1
done

当我运行它时,它会循环4次。每次发送电子邮件时,它都会从user0@domain.com发送所有4个而不是user0,然后是user1,然后是user2,然后是user3,这是我一直在努力实现的目标。我刚刚意识到它根本没有变化。它只是保持我最后离开它的方式。如果有人能帮我理解我做错了什么,我将不胜感激。

3 个答案:

答案 0 :(得分:0)

尝试这样的事情:

#! /bin/bash
while read -r addr; do
    sudo m4 -Daddr="$addr" >/etc/ssmtp/ssmtp.conf <<<'AuthUser=addr'
    sudo ssmtp blahh@blahh.com -v </home/apx/Desktop/message.txt
    sleep 1
done </home/apx/Desktop/emailaddresses.txt

答案 1 :(得分:0)

#!/bin/bash

AddressSources=/home/apx/Desktop/emailaddresses.txt

# number of email
y=$( grep -c -e "${AddressSources}" )

# loop (from last to first email)
while [ ${y} -gt 0 ]
 do
   # catch the specific mail using the line number
   email="$( sed "${y} !d" "${AddressSources}" )"

   # adapt the ssmtp.conf
   sed -i "s/^\(AuthUser=\).*/\1${email}/" /etc/ssmtp/ssmtp.conf

   # send the message
   ssmtp blahh@blahh.com -v < /home/apx/Desktop/message.txt

   # wait and cycle to next email
   sleep 1
   let y-=1
done
  • 基于您的脚本
  • 您的代码中有空格字符,但数据样本中没有空格字符,我会使用数据引用
  • 从最后循环,以避免额外的变通,但只是一个选择
  • 您可以使用while read代替sed逐行接听并循环播放电子邮件

答案 2 :(得分:0)

我正在使用gmail smtp服务器,如果您尝试在gmail上允许smtp,您应该允许此链接上的安全应用,您应该turn on  https://www.google.com/settings/security/lesssecureapps

以root用户身份执行此脚本

cp -avr /etc/ssmtp/ssmtp.conf . > /dev/null
echo "No. Of Msgs For each Email :";read number_of_messages;
echo "Destination Email: ";read Email
y=3
for (( x=1; x<=y; x++ ));
do
emails=`echo $( cat emails | sed -n ''$x''p )`
print_emails=`echo "$emails"`
smtp=`grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" ssmtp.conf.bak`

cat ssmtp.conf | sed 's/'$smtp'/'$print_emails'/g'  ssmtp.conf > /etc/ssmtp/ssmtp.conf
for (( f=1; f<=number_of_messages; f++ ));
do
ssmtp $Email < msg
sleep 5
done
done&

测试并且完美运行

首先我输入了4条为每封电子邮件发送4封邮件(checkmeoffon @ gmail.com,checkmeonoff @ gmail.com) enter image description here

下一步checkmeoffon@gmail.com 4条消息 enter image description here

下一步checkmeonoff@gmail.com 4条消息 enter image description here