
我面臨一個情況,假設我使用下面的腳本減去 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」。它是什麼時候並不重要,它是使用秒進行日期和時間計算的方便的通用參考點。