Bash:计算两个时间戳之间经过的时间

Mar*_*rco 10 linux scripting bash shell-script timestamps

我编写了一个脚本,当某个值不在给定范围内时会通知我。“超出范围”的所有值都记录在一组每日文件中。

每行都以专有的反向方式加时间戳:yyyymmddHHMMSS

现在,我想改进脚本,并在给定超出范围值的上次通知后至少过去 60 分钟时接收通知。

我已经解决了以相反顺序打印日志的问题:

for i in $(ls -t /var/log/logfolder/*); do zcat $i|tac|grep \!\!\!|grep --color KEYFORVALUE; done
Run Code Online (Sandbox Code Playgroud)

结果是:

...
20170817041001 - WARNING: KEYFORVALUE=252.36 is not between 225 and 245 (!!!)
20170817040001 - WARNING: KEYFORVALUE=254.35 is not between 225 and 245 (!!!)
20170817035001 - WARNING: KEYFORVALUE=254.55 is not between 225 and 245 (!!!)
20170817034001 - WARNING: KEYFORVALUE=254.58 is not between 225 and 245 (!!!)
20170817033001 - WARNING: KEYFORVALUE=255.32 is not between 225 and 245 (!!!)
20170817032001 - WARNING: KEYFORVALUE=254.99 is not between 225 and 245 (!!!)
20170817031001 - WARNING: KEYFORVALUE=255.95 is not between 225 and 245 (!!!)
20170817030001 - WARNING: KEYFORVALUE=255.43 is not between 225 and 245 (!!!)
20170817025001 - WARNING: KEYFORVALUE=255.26 is not between 225 and 245 (!!!)
20170817024001 - WARNING: KEYFORVALUE=255.42 is not between 225 and 245 (!!!)
20170817012001 - WARNING: KEYFORVALUE=252.04 is not between 225 and 245 (!!!)
...
Run Code Online (Sandbox Code Playgroud)

无论如何,我一直在计算其中两个时间戳之间的秒数,例如:

20170817040001
20160312000101
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能计算两个时间戳之间经过的时间?

roa*_*ima 16

这将为您提供以秒为单位的日期(自 UNIX 时代以来)

date --date '2017-08-17 04:00:01' +%s    # "1502938801"
Run Code Online (Sandbox Code Playgroud)

这将为您提供几秒钟内的可读字符串形式的日期

date --date '@1502938801'    # "17 Aug 2017 04:00:01"
Run Code Online (Sandbox Code Playgroud)

所以所有需要的是将您的日期/时间戳转换为 GNUdate可以理解的格式,使用数学来确定差异,并输出结果

datetime1=20170817040001
datetime2=20160312000101

# bash string manipulation
datestamp1="${datetime1:0:4}-${datetime1:4:2}-${datetime1:6:2} ${datetime1:8:2}:${datetime1:10:2}:${datetime1:12:2}"
datestamp2="${datetime2:0:4}-${datetime2:4:2}-${datetime2:6:2} ${datetime2:8:2}:${datetime2:10:2}:${datetime2:12:2}"

# otherwise use sed
# datestamp1=$(echo "$datetime1" | sed -nr 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')
# datestamp2=$(echo "$datetime2" | sed -nr 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')

seconds1=$(date --date "$datestamp1" +%s)
seconds2=$(date --date "$datestamp2" +%s)

delta=$((seconds1 - seconds2))
echo "$delta seconds"    # "45197940 seconds"
Run Code Online (Sandbox Code Playgroud)

我们没有在这里提供时区信息,所以它假设本地时区。您从日期时间开始的秒值可能与我的不同。(如果您的值是 UTC,那么您可以使用date --utc.)


αғs*_*нιη 9

这很容易使用包中提供的datediff命令dateutils

ddiff -i '%Y%m%d%H%M%S' 20170817040001 20160312000101
Run Code Online (Sandbox Code Playgroud)

  • 或 dateutils.ddiff (5认同)
  • 另请注意,Linux Ubuntu 16.04 中此命令的正确名称是“dateutils.ddiff” (3认同)