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

Bash 日志文件中两个日期之间的时间差,bash,shell,datetime,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

我试图得到两个日期之间的时差,如下面在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})

谢谢

让我们定义shell变量:

$ tail_info=05-31-2017:04:30:57
$ head_info=05-31-2017:04:27:37
现在,让我们创建一个函数,将这些日期转换为自纪元起的秒数:

$ date2sec() { date -d "$(sed 's|-|/|g; s|:| |' <<<"$*")" +%s; }
$ date -d "05/31/2017 04:30:57" +%s
1496230257
如上所述,这需要
bash
(或类似的高级shell)和GNU
date
。换句话说,这应该适用于任何标准Linux。要在OSX上执行此操作,可能需要对
date
命令进行一些更改

工作原理 从函数
date2sec
中最内部的命令开始,我们有:

sed 's|-|/|g; s|:| |' <<<"$*"
使用此表单,我们可以使用
日期
查找自纪元起的秒数:

$ date2sec() { date -d "$(sed 's|-|/|g; s|:| |' <<<"$*")" +%s; }
$ date -d "05/31/2017 04:30:57" +%s
1496230257
对于head_信息:

$ date -d "05/31/2017 04:27:37" +%s
1496230057
现在我们有了它,剩下的就是减去时间:

$ echo $(( 1496230257 - 1496230057 ))
200

让我们定义shell变量:

$ tail_info=05-31-2017:04:30:57
$ head_info=05-31-2017:04:27:37
现在,让我们创建一个函数,将这些日期转换为自纪元起的秒数:

$ date2sec() { date -d "$(sed 's|-|/|g; s|:| |' <<<"$*")" +%s; }
$ date -d "05/31/2017 04:30:57" +%s
1496230257
如上所述,这需要
bash
(或类似的高级shell)和GNU
date
。换句话说,这应该适用于任何标准Linux。要在OSX上执行此操作,可能需要对
date
命令进行一些更改

工作原理 从函数
date2sec
中最内部的命令开始,我们有:

sed 's|-|/|g; s|:| |' <<<"$*"
使用此表单,我们可以使用
日期
查找自纪元起的秒数:

$ date2sec() { date -d "$(sed 's|-|/|g; s|:| |' <<<"$*")" +%s; }
$ date -d "05/31/2017 04:30:57" +%s
1496230257
对于head_信息:

$ date -d "05/31/2017 04:27:37" +%s
1496230057
现在我们有了它,剩下的就是减去时间:

$ echo $(( 1496230257 - 1496230057 ))
200

您当前的问题是围绕字符串索引赋值和可疑引用包含错误的
(…)
。看起来你打算:

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
中的差异执行类似的操作,正如John在其答案中所示,以得出时差。注意,字符串索引仅限于bash,而
sed
解决方案(不含herestring)可以在所有POSIX shell上移植。

您当前的问题是围绕字符串索引分配和可疑引用包含错误的
(…)
。看起来你打算:

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
中的差异执行类似的操作,正如John在其答案中所示,以得出时差。注意,字符串索引仅限于bash,而
sed
解决方案(不含herestring)可以移植到所有POSIX shell上。

我对这个答案不屑一顾。非常巧妙地使用由herestring提供的日期内的命令替换
:)
@DavidC.Rankin谢谢!谢谢你,约翰……你答对了。我对这个答案脱帽致敬。非常巧妙地使用由herestring提供的日期内的命令替换
:)
@DavidC.Rankin谢谢!谢谢你,约翰……你搞定了。