シェルスクリプトからAMとPMの時間を正しく減算するには?

シェルスクリプトからAMとPMの時間を正しく減算するには?

状況に直面しています。以下のスクリプトを使用して午前1時と午後23時を除くと、実際には2時間の21時間の差が発生します。

これは私のスクリプトです。

#!/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. 2つの日付間の差(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」。何時かは重要ではなく、秒を使用して日付と時刻を計算するのに便利な一般的な基準点です。

関連情報