Como subtrair corretamente a hora em AM e PM no shell script?

Como subtrair corretamente a hora em AM e PM no shell script?

Estou enfrentando uma situação em que, supondo que subtraio 01:00:00 AM e 23:00:00 PM usando meu script abaixo, estou obtendo uma diferença de 21 horas quando são apenas 2 horas.

Aqui está meu roteiro:

#!/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

Existe uma maneira de conseguir isso? Por favor sugira.

EDITAR:

$DIR/sessão_$DATE.txt

é um arquivo de sessão netezza com linhas semelhantes às abaixo. Mostrando apenas a primeira linha abaixo:

26195 sql-odbc XXX  27-May-21 01:18:51 CDT

Responder1

Há tantas coisas erradas em seu roteiro que é difícil saber por onde começar. Vou me contentar com "você está tornando isso mais complicado do que precisa ser".

Olhando para o seu script, parece que você deseja saber o número de horas entre a) a data e a hora em um arquivo de log eb) agora. Portanto:

  1. você precisa da data e hora atuais no formato segundos desde a época (*).

    X1="$(date +%s)"
    
  2. você precisa da data e hora extraídas da primeira linha do arquivo de log da sessão, também convertidas em segundos desde a época.

    X2="$(date -d "$(awk 'NR==1 {print $(NF-2),$(NF-1),$NF; nextfile}' session.txt)" +%s)"
    
  3. Você precisa calcular a diferença entre essas duas datas (X1-X2), em horas (/3600).

    let diff=(X1-X2)/3600
    

Exemplo:

#!/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

(*) por razões históricas, a "época" é definida como Meia-noite de 1º de janeiro de 1970. "01-01-1970 00:00:00". Realmente não importa quando é, é um ponto de referência comum e conveniente para fazer cálculos de data e hora usando segundos.

informação relacionada