我有一个脚本可以检查我的日志,查看应用程序关闭和备份的时间戳(应用程序的可用性)。
我想找到时间戳列表之间的差异,然后将所有这些差异加起来,这样我知道应用程序已关闭的总时间。所以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
或类似的东西。如何读取时间戳,将其转换为数字,从两个文件中减去匹配的行,然后将这些行中的所有总和相加?
答案 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