使用以下小 awk 脚本,我收到一封电子邮件通知。但我想收到这封电子邮件仅有的如果$1
大于或等于100。
if 语句应该放在什么位置?我尝试了很多版本都没有成功。按照我的脚本:
awk '
BEGIN{print "Subject:SASL Spam\nFrom:Server.de <[email protected]>\nTo:[email protected]"}
END{printf("%s\015\n", $1" | "$2)}
' /home/web0/html/tools/uptime/sasl.txt | /usr/lib/sendmail -t [email protected]
答案1
你可以这样做(为了便于阅读,我将其缩短了一点):
{ awk 'BEGIN{...} END{...} END{if($1<100){exit(1)}}' file || exit; } > >(sendmail -t ...)
awk
被称为复合命令。if($1<100)
检查值exit(1)
中止内部代码的进一步执行awk
并返回退出代码 1
|| exit
awk
当命令返回 false(退出代码大于 0)时执行。然后退出 shell,不再执行任何命令。我在这里不使用管道|
,因为这将打开一个子 shell,然后退出该子 shell,并且无论如何都会执行下一个命令。>(sendmail -t ...)
输出被发送到sendmail
(如果尚未退出)。
整个命令将如下所示:
{ awk 'BEGIN{print "Subject:SASL Spam\nFrom:Server.de <[email protected]>\nTo:[email protected]"}
END{printf("%s\015\n", $1" | "$2)} END{if($1<100){exit(1)}}' \
/home/web0/html/tools/uptime/sasl.txt || exit; } > >(/usr/lib/sendmail -t [email protected])
答案2
因此,这使用单个 awk 语句来准备一封电子邮件,其中仅包含源文件中以数字 >=100 开头的行中的数据,如果没有一个满足此条件,则不会发送电子邮件,这就是我认为您正在尝试的实现。它还确保第一个字段是数字,以防出现一些意外文本,这可能会混淆数字比较:
awk '
{
if ($1~/^[0-9]*$/ && $1>=100) {
if (BEENHERE!=1) print "Subject:SASL Spam\nFrom:Server.de <[email protected]>\nTo:[email protected]\n"
printf("%s\015\n", $1" | "$2); BEENHERE=1
}
}' /home/web0/html/tools/uptime/sasl.txt | \
/usr/lib/sendmail -t [email protected]