BASH:减去日期以获得运行时

时间:2014-10-04 18:19:05

标签: bash

我有一个从午夜开始的备份,并在完成后发送电子邮件。我想基于以下内容检查运行时:

日志格式(/ var / log / maillog):

Oct  4 08:23:35 test postfix/smtp[5351]: C5BBB2115C: to=<an@example.com>, relay=aspmx.l.google.com[74.125.206.26]:25, delay=30213, delays=30212/0.06/0.22/0.46, dsn=2.0.0, status=sent (250 2.0.0 OK 1412407415 q20si4382781wie.36 - gsmtp)

我不确定如何从午夜减去完成时间以接收运行时间(如果有帮助,它不必是awk)?

示例:

# awk '/an@example.com/{ printf ("%s%s%s\n", "Completed at: ", $3, " Runtime: ") }' /var/log/maillog
Completed at: 17:45:52 Runtime: 17h:45m:52s
Completed at: 08:56:00 Runtime: 08h:56m:00s
Completed at: 07:18:32 Runtime: 07h:18m:32s
Completed at: 05:53:23 Runtime: 05h:53m:23s
Completed at: 06:03:24 Runtime: 06h:03m:24s
Completed at: 08:50:51 Runtime: 08h:50m:51s
Completed at: 08:23:35 Runtime: 08h:23m:35s

1 个答案:

答案 0 :(得分:1)

如果您确定备份时间少于24小时,则无需减去任何内容。您只能以不同的方式格式化输出:

$ awk '/an@example.com/{ "date -d" $3 " +%Hh:%Mm:%Ss" | getline T; close("date"); printf ("%s%s%s\n", "Completed at: ", $3, " Runtime: " T) }'

Completed at: 08:23:35 Runtime: 08h:23m:35s

我在这里使用"date" | getline T构造将date的输出分配给变量T并在你的awk单行内完成任务。

但是,如果您的备份可以采取&gt; 24h然后你必须给出起点作为第二个输入(到目前为止你的问题中没有出现),然后将date --date="03/10/2014 08:23:35" +"%s"的两个日期转换为自1970年以来的秒数,然后再减去。