我的日志文件格式如下:
日志.txt
Unavailable 06.08.2014 23:59:36 - 07.08.2014 00:00:36
Unavailable 15.08.2014 04:53:32 - 15.08.2014 04:53:32
Available 15.08.2014 04:54:32 - 15.08.2014 05:17:32
Unavailable 15.08.2014 05:18:32 - 15.08.2014 05:18:32
Unavailable 15.08.2014 08:22:00 - 15.08.2014 08:22:00
Available 15.08.2014 08:23:00 - 17.08.2014 01:44:27
Unavailable 17.08.2014 01:45:27 - 17.08.2014 01:52:33
Available 17.08.2014 01:53:33 - 02.09.2014 11:07:21
Run Code Online (Sandbox Code Playgroud)
我需要以秒为单位计算不可用时间。我不是任何 sed/awk 专家,所以我解决这个问题的方法非常简单:
cat log.txt | grep "Unav" | sed -r 's/\<Unavailable\>//g;s/:/ /g;s/\./ /g' |
awk -F- '{d2=mktime($2);d1=mktime($1);print d2-d1;}' | awk '{s+=$1} END {print s}'
Run Code Online (Sandbox Code Playgroud)
我很惊讶地发现,当日期遇到日期(午夜)时,计算会出错。第一行的计算结果显示,EPOCH 中的差异为31449660秒,因此将是Thu Dec 31 01:01:00 CET 1970。但计算结果应该是60秒。有人可以解释一下为什么系统返回这个结果吗?
如果您要使用的话,sed您不需要所有这些。此外,正如示例数据所示,差异应为 60 秒。grepawk
从man页面:
mktime(datespec) 将 datespec 转换为时间戳,格式与 systime() 返回的格式相同。它类似于 ISO C 中的同名函数。参数 datespec 是“YYYY MM DD HH MM SS [DST]”形式的字符串。
尝试以下命令:
awk '
$1 == "Unavailable" {
split ($2, d1, /[.]/);
split ($3, t1, /:/);
split ($5, d2, /[.]/);
split ($6, t2, /:/);
end = mktime (d2[3]" "d2[2]" "d2[1]" "t2[1]" "t2[2]" "t2[3])
start = mktime (d1[3]" "d1[2]" "d1[1]" "t1[1]" "t1[2]" "t1[3])
print end - start
}' log.txt
60
0
0
0
426
Run Code Online (Sandbox Code Playgroud)
这将在几秒钟内打印出差异。如果您希望以其他格式打印输出,您可以使用strftimeGNUawk库中的函数。