日志文件中两个日期之间的时差

时间:2017-05-31 06:05:07

标签: bash shell datetime

我正在尝试获取两个日期之间的时差,如下面在Bash脚本中给出的那样。但是我没有成功

head_info: 05-31-2017:04:27:37
tail_info: 05-31-2017:04:30:57

问题在于,在上述时间改造之后,由于空间而在数秒内尝试计算时,忽略了时间。

这是我的剧本:

fm_head_info=(${head_info:6:4}"-"${head_info:0:2}"-"${head_info:3:2}" \
             "${head_info:11:8})
fm_tail_info=(${tail_info:6:4}"-"${tail_info:0:2}"-"${tail_info:3:2}" \
             "${tail_info:11:8})
$ fm_head_info
-bash: 2017-05-31: command not found

谢谢

2 个答案:

答案 0 :(得分:1)

让我们定义你的shell变量:

$ tail_info=05-31-2017:04:30:57
$ head_info=05-31-2017:04:27:37

现在,让我们创建一个函数将这些日期转换为second-since-epoch:

$ date2sec() { date -d "$(sed 's|-|/|g; s|:| |' <<<"$*")" +%s; }

要以秒为单位查找这两个日期之间的时差:

$ echo $(( $(date2sec "$tail_info") - $(date2sec "$head_info") ))
200

如上所述,这需要bash(或类似的高级shell)和GNU date。换句话说,这应该适用于任何标准Linux。为了使其在OSX上运行,可能需要对date命令进行一些更改。

如何运作

从函数date2sec内的最里面的命令开始,我们有:

sed 's|-|/|g; s|:| |' <<<"$*"

在函数的argumnet中,这会将所有-替换为/,并用空格替换第一个:。这会将日期从输入中的格式转换为GNU date函数将理解的格式。例如:

$ sed 's|-|/|g; s|:| |' <<<"05-31-2017:04:30:57"
05/31/2017 04:30:57

使用此表单,我们可以使用date查找秒 - 自 - 纪元:

$ date -d "05/31/2017 04:30:57" +%s
1496230257

并且,对于head_info:

$ date -d "05/31/2017 04:27:37" +%s
1496230057

现在我们已经有了,剩下的就是减去时间:

$ echo $(( 1496230257 - 1496230057 ))
200

答案 1 :(得分:1)

您的直接问题是包含错误的(...)围绕您的字符串索引编号和您的可疑引文。它看起来像你打算:

fm_head_info="${head_info:6:4}-${head_info:0:2}-${head_info:3:2} ${head_info:11:8}"
fm_tail_info="${tail_info:6:4}-${tail_info:0:2}-${tail_info:3:2} ${tail_info:11:8}"

您对字符串索引的使用是正确的,例如

#!/bin/bash

head_info=05-31-2017:04:27:37
tail_info=05-31-2017:04:30:57

fm_head_info="${head_info:6:4}-${head_info:0:2}-${head_info:3:2} ${head_info:11:8}"
fm_tail_info="${tail_info:6:4}-${tail_info:0:2}-${tail_info:3:2} ${tail_info:11:8}"

echo "fm_head_info: $fm_head_info"
echo "fm_tail_info: $fm_tail_info"

示例使用/输出

$ bash headinfo.sh
fm_head_info: 2017-05-31 04:27:37
fm_tail_info: 2017-05-31 04:30:57

然后你可以做一些与date -d "$var" +%s中的差异类似的事情,正如约翰在答案中所显示的那样,以达到时差。注意,字符串索引仅限于bash,而sed解决方案(缺少 herestring )在所有POSIX shell上都是可移植的。