如何使用系统命令发送带有AWK的电子邮件



所以我有这个大学家庭作业,我需要向特定学生组(在diak.lst文件中列出)的所有人发送电子邮件,并将文件中的文本附加到邮件中。学生的地址形式类似:xy9999,2个字符和4个数字。问题似乎出在系统部分,它说没有"附加文件"这样的东西。

diak.lst 采用以下格式:

F-姓名,姓名,地址,组
乔治·彼得 gp9999 511

这是脚本

#!/bin/bash
if [ ! -f $2 ] 
    then echo $2 Not a file!!
    exit 1
fi
awk -v group=$1 -v attachedfile=$2 'BEGIN {fs=" ";nr_sent_to=0;}
{
        if ($4==group){
    system("mail -s "Attention!"" $3 " < " attachedfile);
    nr_sent_to++;
    } 
}
END {
print nr_sent_to,"-have received the mail";
}
' diak.lst
mail看到的

字符串中 $3 之前没有空格 - 尝试将"Attention!"" $3更改为 "Attention!" " $3

你有fs=" "什么都不做。也许你的意思是FS=" "但这是默认值,所以它什么也不做。

您的输入文件有一个逗号分隔的标题行,因此在处理 $3 等时将为空,请添加一个 NR>1 子句。

awk 变量已经初始化为 0/NULL,因此无需nr_sent_to=0。然后,您必须在 END 部分中打印时添加+0,以确保在没有发送电子邮件时打印数字零而不是 NULL 字符串。

鉴于您在 BEGIN 部分中所做的一切都没有做任何有用的事情,请删除 BEGIN 部分。

不会影响脚本执行,但:awk 不是 C - 丢失所有无用的尾随分号。

将条件放在脚本的条件部分,而不是操作部分。

引用你的外壳变量。

因此,通过更多的清理,最终结果将是:

awk -v group="$1" -v attachedfile="$2" '
NR>1 && ($4==group) {
    system("mail -s "Attention!" " $3 " < " attachedfile)
    nr_sent_to++
}
END {
    print nr_sent_to+0, "-have received the mail"
}
' diak.lst

最新更新