我面临着一种情况,假设我使用下面的脚本减去 01:00:00 AM 和 23:00:00 PM,我会得到 21 小时的差异,而实际上只有 2 小时。
这是我的脚本:
#!/bin/sh
Tm1=$(echo `date +%H:%M:%S`)
T1=`date -d "$Tm1" +%r`
X1=$(echo $T1 | awk -F: '{print ($1 *3600) + ($2 * 60) + $3}')
Tm2=$(cat $DIR/session_$DATE.txt | awk '{print $5}' | head -1)
T2=`date -d "$Tm2" +%r`
X2=$(echo $T2 | awk -F: '{print ($1 *3600) + ($2 * 60) + $3}')
diff=$(($X1-$X2))
TimeDifference=$(echo print $diff/3600. | python)
echo $TimeDifference
有办法实现这一点吗?请建议。
编辑:
$DIR/session_$DATE.txt
它是一个 netezza 会话文件,具有类似的行,如下所示。下面仅显示第一行:
26195 sql-odbc XXX 27-May-21 01:18:51 CDT
答案1
你的脚本有太多问题,以至于很难知道从哪里开始。我会满足于“你让这种方式变得比需要的更复杂”。
从您的脚本来看,您似乎想知道a)日志文件中的日期和时间与b)现在之间的小时数。所以:
您需要以自纪元以来的秒数 (*) 格式表示的当前日期和时间。
X1="$(date +%s)"
您需要从会话日志文件的第一行中提取的日期和时间,并将其转换为自纪元以来的秒数。
X2="$(date -d "$(awk 'NR==1 {print $(NF-2),$(NF-1),$NF; nextfile}' session.txt)" +%s)"
您需要计算这两个日期之间的差异 (X1-X2),以小时 (/3600) 为单位。
let diff=(X1-X2)/3600
例子:
#!/bin/bash
# get current time
X1="$(date +%s)"
# get the date, time, and timezone from the last 3 fields of the first line
logfile=session.txt
X2="$(date -d "$(awk 'NR==1 {print $(NF-2),$(NF-1),$NF; nextfile}' "$logfile")" +%s)"
# calculate the difference in hours. Note that bash arithmetic is integer only,
# so the result of the division is automatically rounded down.
let diff=(X1-X2)/3600
echo $diff
(*) 由于历史原因,“纪元”被定义为 1970 年 1 月 1 日午夜。“01-01-1970 00:00:00”。它是什么时候并不重要,它是使用秒进行日期和时间计算的方便的通用参考点。