如何计算总经过时间

时间:2019-06-04 02:20:52

标签: bash datetime ls date-arithmetic stat

如何基于

计算经过时间

开始时间=

[user001a@dev51 logs]# grep 'Recovery Manager' 
refresh_03Jun2019_0250.log|head -1|awk -F'on ' '{print $NF}';
Jun 3 02:50:02 2019
[user001a@dev51 logs]#

结束时间=

[user001a@dev51 logs]# ls -l refresh_03Jun2019_0250.log
-rw-r--r--. 1 user001a grp001a 170050 Jun  3 05:06 
refresh_03Jun2019_0250.log
[user001a@dev51 logs]#

注意-统计信息缺少出生时间,因此在计算文件创建和修改时间时统计信息可能不是一个好选择:

[user001a@dev51 logs]# stat refresh_03Jun2019_0250.log
  File: `refresh_03Jun2019_0250.log'
  Size: 170050          Blocks: 344        IO Block: 4096   regular file
Device: 811h/2065d      Inode: 1474545     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  219/  user001a)   Gid: (  219/grp001a)
Access: 2019-06-03 05:06:40.830829026 -0400
Modify: 2019-06-03 05:06:40.827828883 -0400
Change: 2019-06-03 05:06:40.827828883 -0400
[user001a@dev51 logs]#

Sample1输出:

StartTime=June 3, 2019 at 2:50:02 am
EndTime=June 3, 2019 at 5:06:40 am
ElapsedTime=2 hours, 16 minutes and 38 seconds

Sample2输出:

ElapsedTime=2 hours, 16 minutes and 38 seconds

1 个答案:

答案 0 :(得分:0)

此解决方案的限制:最多23小时。要获得更多,需要增加几天。

StartTime="June 3, 2019 at 2:50:02 am"
EndTime="June 3, 2019 at 5:06:40 am"
StartTimeInEpoch=`echo $StartTime | sed 's/at //g' | date -f- +"%s"`
EndTimeInEpoch=`echo $EndTime | sed 's/at //g' | date -f- +"%s"`
echo $EndTimeInEpoch-$StartTimeInEpoch | bc | sed 's/^/@/g' | date -u -f- "+%_H hours %_M minutes %_S seconds"

输出:

2 hours 16 minutes 38 seconds

假设日期已包含在变量StartTimeEndTime中。有必要从其中删除atsed为此。然后将两个日期都转换为纪元时间+"%s"-f-告诉date从stdin(管道)中获取日期。然后我们可以减去日期,将@添加到开头,并用date进行格式化。 -u表示UTC时间-无时移。