我需要计算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
我编写了一个脚本,首先根据第4列对列进行排序,即时间,下面是脚本
#!/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
如果结束时间大于StartTime
在当前状态下,如果开始时间大于结束时间,在这种情况下,Endhour将大于StartHour
场景::让我们说如果RMAN在14:56开始并在15:02完成,在这种情况下,从开始到结束的总时间仅为00:06 Min但脚本将显示1:-54
任何想法......
答案 0 :(得分:1)
不是单独计算小时数和分钟数,而是计算自开始和结束午夜以来的分钟数,并使用它来执行算术。
类似于:
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'日期'如果您可以使用它 - 例如。请参阅Convert an ISO date to seconds since epoch in linux bash),但是那个'另一个问题。