我有一个bash脚本,它从一个包含4列(无标题)的文本文件中读取行。行数最多可为4行或更少。每行中的单词由空格字符分隔。
ab@from.com xyz@to.com;abc@to.com Sub1 MailBody1
xv@from.com abc@to.com;poy@to.com Sub2 MailBody2
mb@from.com gmc@to.com;abc@to.com Sub3 MailBody3
yt@from.com gqw@to.com;xyz@to.com Sub4 MailBody4
目前,我正在解析文件,在获取每一行之后,我将每行中的每个单词存储到变量中并将mailx调用四次。想知道是否对下面提到的逻辑有一个优雅的awk / sed解决方案。
read $line
,将每一行存储在变量i=( $line1 )
,j=( $line2 )
等${i[0]}
,${i[1]}
,${i[2]}
和${i[3]}
等mailx -s ${i[2]} -t ${i[1]} -r ${i[0]} < ${i[3]}
mailx
awk或sed是否为上述迭代/循环逻辑提供了一个优雅的解决方案?
答案 0 :(得分:4)
试一试:
head -n 4 mail.txt | while read from to subject body; do
mailx -s "$subject" -t "$to" -r "$from" <<< "$body"
done
head -n 4
最多可从您的文本文件中读取四行。read
可以从一行读取多个变量,因此我们可以使用命名变量来提高可读性。<<<
可能是你想要的重定向,而不是<
。可能。答案 1 :(得分:2)
如果您对如何在文件中显示文本行有很多控制权,那么上面的while循环可以很好地替代sed和awk。 read命令也可以使用-d标志。
另一个简单的例子:
我曾使用mysql获取用户和主机列表,将其放入文件/ tmp / userlist,文本如下所示:
user1 host1
user2 host2
user3 host3
我将这些变量传递给mysql命令以获取这些用户和主机的授权信息并附加到/ tmp / grantlist:
cat /tmp/userlist | while read user hostname;
do
echo -e "\n\nGrabbing user $user for host $hostname..."
mysql -u root -h "localhost" -e "SHOW GRANTS FOR '$user'@$hostname" >> /tmp/grantlist
done