【问题标题】:subtracting two lists of timestamps from each other in bash在bash中相互减去两个时间戳列表
【发布时间】:2017-06-17 08:28:21
【问题描述】:

我有一个脚本可以检查我的日志中的应用程序关闭和备份时间(应用程序的可用性)的时间戳。
我想找出时间戳列表之间的差异,然后将所有这些差异相加,这样我就知道应用程序关闭的总时间。所以 downtime.txt 文件有一个这样的列表:
04:55:51
05:41:51
并且 uptime.txt 有一个类似格式的列表:
04:56:59
05:42:21

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

【问题讨论】:

  • 您的时间戳中没有日期组件吗?

标签: bash while-loop arithmetic-expressions


【解决方案1】:

您可以使用date 命令转换时间戳。不幸的是,您的时间戳上没有日期,不确定当您翻过午夜时会发生什么,但假设您没有这个问题,您可以选择固定日期“01-Jan-1970 UTC”进行计算.

这是你的代码:

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 日 UTC 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 选项和@ 指定秒数(同样我们使用1970 年1 月1 日作为基准,这就是@ 的含义),以及+%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

【讨论】:

  • 我最终使用 awk 将小时乘以 3600,将分钟乘以 60 并将它们相加,但我喜欢 date 命令。我最初隔离了时间戳,但我可以让我的脚本也包含日期,这样它就可以在午夜之前和之后记录事情。感谢您花时间解决我的问题!
猜你喜欢
  • 2017-06-07
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 2018-10-17
  • 2011-04-02
  • 1970-01-01
相关资源
最近更新 更多