5

我有一个 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
  • 这样做直到没有更多行或达到最多 4 行

awk 或 sed 是否为上述迭代/循环逻辑提供了一个优雅的解决方案?

4

2 回答 2

5

试一试:

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可以从一行读取多个变量,因此我们可以使用命名变量来提高可读性。
  • <<<可能是您想要的重定向,而不是<. 大概。
于 2011-07-20T03:57:53.770 回答
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
于 2012-05-18T20:18:15.240 回答