在bash中相互减去两个时间戳列表

时间:2017-01-31 18:59:18

标签: bash while-loop arithmetic-expressions

我有一个脚本可以检查我的日志,查看应用程序关闭和备份的时间戳(应用程序的可用性)。
我想找到时间戳列表之间的差异,然后将所有这些差异加起来,这样我知道应用程序已关闭的总时间。所以downtime.txt文件有一个这样的列表:
4点55分51秒
5时41分51秒
uptime.txt有一个类似格式的列表:
4点56分59秒
5点42分21秒

如果我不需要将时间戳转换为算术数字,我想我可以     粘贴downtime.txt uptime.txt | awk' {print $ 1 - $ 2}'> timedown.txt
或类似的东西。如何读取时间戳,将其转换为数字,从两个文件中减去匹配的行,然后将这些行中的所有总和相加?

1 个答案:

答案 0 :(得分:1)

您可以使用date命令转换时间戳。不幸的是,你的时间戳上没有日期,不确定当你在午夜过夜时会发生什么,但假设你没有遇到这个问题,你可以选择固定日期&#34 ; 1970年1月1日 - 1970年"用于计算目的。

这是你的代码:

paste downtime.txt uptime.txt | while read d u; do echo $(( $(date -d "01-Jan-1970 UTC $u" +%s) - $(date -d "01-Jan-1970 UTC $d" +%s) )); done

说明:date命令将时间戳转换为秒。 -d选项表示在以下日期执行,而不是"现在"。因此我们使用您的输入文件给它一个日期,假设指定的时间是从午夜开始。由于date基于自1970年1月1日1970年00:00:00起的秒数,我们添加该日期以简化结果。 +%s参数意味着,告诉我自1970年1月1日以来的秒数。这是转换的来源。由于我们指定了-d,它使用您指定的时间戳而不是"现在"。因此$(date -d "01-Jan-1970 UTC $u" +%s)的值是正常运行时间午夜以来的秒数。然后我们使用$(( ... ))从正常运行时间秒中减去停机时间秒,以获得两个时间戳之间的秒数。 (如果您的bash没有该功能,则可以使用$(expr $(date -d "01-Jan-1970 UTC $u" +%s) - $(date -d "01-Jan-1970 UTC $d" +%s) )代替。)

更新:我应该完成这份工作。要累计和计算总时间,您可以添加| awk '{total=total+$1} END {print $total}'。要将其转换回小时和分钟,请再次使用date;使用-u选项阻止转换为本地时间,使用-d @选项指定秒数(我们再次使用01年1月1日作为基数,&#39 ; @意味着什么),+%T转换为小时和分钟,但如果超过24小时,您将失去额外的天数。

date -u -d @$(paste downtime.txt uptime.txt | while read d u; do echo $(( $(date -d "01-Jan-1970 UTC $u" +%s) - $(date -d "01-Jan-1970 UTC $d" +%s) )); done | awk '{total=total+$1} END {print total}') +%T