쉘 스크립트에서 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. 두 날짜 간의 차이(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". 몇 시인지는 중요하지 않으며, 초를 사용하여 날짜와 시간을 계산하는 데 편리한 보편적인 기준점입니다.

관련 정보