计算BASH脚本中的时间差



我需要计算rman start和rman end之间的时差。日志就像这样

-rw-r----- oracle/dba 2017-03-11 21:56:35 storage/backup/daily/ALG_PDB_2drut5jf.alg
-rw-r----- oracle/dba 2017-03-11 21:56:34 storage/backup/daily/ALG_PDB_2erut5jf.alg
-rw-r----- oracle/dba 2017-03-11 21:56:07 storage/backup/daily/ALG_PDB_2frut5jf.alg
-rw-r----- oracle/dba 2017-03-11 21:56:29 storage/backup/daily/ALG_PDB_2grut5jv.alg
-rw-r----- oracle/dba 2017-03-11 21:39:14 storage/backup/daily/BKPPDB_28rut42s.F_bkp
-rw-r----- oracle/dba 2017-03-11 21:47:28 storage/backup/daily/BKPPDB_29rut42s.F_bkp
-rw-r----- oracle/dba 2017-03-11 21:42:41 storage/backup/daily/BKPPDB_2arut42s.F_bkp
-rw-r----- oracle/dba 2017-03-11 21:55:33 storage/backup/daily/BKPPDB_2brut4k8.F_bkp
-rw-r----- oracle/dba 2017-03-11 21:55:36 storage/backup/daily/c-2819904582-20170311-00
-rw-r----- oracle/dba 2017-03-11 21:56:42 storage/backup/daily/c-2819904582-20170311-01
-rw-r----- oracle/dba 2017-03-11 21:56:41 storage/backup/daily/control_PDB_2hrut5kp.ctl

我编写了一个脚本,该脚本首先基于第四列的列,以下是脚本

#!/bin/bash -x
if [ -f /storage/backup/weekly/DB-Backup-$(date -d "yesterday" '+%a-%d%m%y').tgz ]
 then
export StartMin=$(tail -30 /storage/backup/weekly/DailyCompressionLog|grep "^-|^ -" |sort -k5|awk '{print $5}' |awk -F ":" '{print $2}'|awk 'NR==1; END{print}'|awk 'FNR==1 {print $1}')
export EndMin=$(tail -30 /storage/backup/weekly/DailyCompressionLog|grep "^-|^ -" |sort -k5|awk '{print $5}' |awk -F ":" '{print $2}'|awk 'NR==1; END{print}'|awk 'FNR==2 {print $1}')
export StartHour=$(tail -30 /storage/backup/weekly/DailyCompressionLog|grep "^-|^ -" |sort -k5|awk '{print $5}' |awk -F ":" '{print $1}'|awk 'NR==1; END{print}'|awk 'FNR==1 {print $1}')
export EndHour=$(tail -30 /storage/backup/weekly/DailyCompressionLog|grep "^-|^ -" |sort -k5|awk '{print $5}' |awk -F ":" '{print $1}'|awk 'NR==1; END{print}'|awk 'FNR==2 {print $1}')
echo "Backup for `date -d "yesterday" '+%a-%d%m%y'`" >> /storage/backup/weekly/MonthlyCompressionLog
echo -e "RMAN Backup Started at $StartHour":"$StartMin" >> /storage/backup/weekly/MonthlyCompressionLog
echo -e "RMAN Backup Ended   at $EndHour":"$EndMin" >> /storage/backup/weekly/MonthlyCompressionLog
echo -e "Time taken to Complete Backup Job Hours:Mins $((EndHour-StartHour))":"$((EndMin-StartMin))" >> /storage/backup/weekly/MonthlyCompressionLog
echo -e "-------------------------------------------------------n" >> /storage/backup/weekly/MonthlyCompressionLog

脚本工作时(成功)

如果结束时间大于开始时间

脚本失败

在当前状态下,如果开始时间大于结束时间,则在这种情况下,末日将大于starthour

方案::说RMAN是否从14:56开始并在15:02完成,在这种情况下,从头到尾的总时间仅为00:06分钟,但脚本将显示1:-54

任何想法....

,而不是分别计算小时和分钟,计算午夜以来开始和结束的分钟数,并使用它进行算术。

所以类似:

StartNumMins=$(( $StartHour * 60 + $StartMin ))
EndNumMinutes=$(( $EndHour * 60 + $EndMin ))
MinutesDiff=$(( $EndNumMinutes - $StartNumMins ))
DiffHours="0$(($MinutesDiff / 60))"
DiffMins="0$(($MinutesDiff % 60))"
echo "Diff is $MinutesDiff minutes, which is ${DiffHours:-2}:${DiffMins:-2}"

产生:

Diff is 6 minutes, which is 00:06

当然,如果您的过程跨越午夜,那么您必须考虑开始/结束日期,而不仅仅是时间。有一些选择要这样做(例如,如果您可以使用GNU的"日期",例如。>

最新更新