如何在shell脚本中正确减去AM和PM的时间?

如何在shell脚本中正确减去AM和PM的时间?

我面临着一种情况,假设我使用下面的脚本减去 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)现在之间的小时数。所以:

  1. 您需要以自纪元以​​来的秒数 (*) 格式表示的当前日期和时间。

    X1="$(date +%s)"
    
  2. 您需要从会话日志文件的第一行中提取的日期和时间,并将其转换为自纪元以来的秒数。

    X2="$(date -d "$(awk 'NR==1 {print $(NF-2),$(NF-1),$NF; nextfile}' session.txt)" +%s)"
    
  3. 您需要计算这两个日期之间的差异 (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”。它是什么时候并不重要,它是使用秒进行日期和时间计算的方便的通用参考点。

相关内容