awk 发送电子邮件,如果

awk 发送电子邮件,如果

使用以下小 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
  • || exitawk当命令返回 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]

相关内容