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:
você precisa da data e hora atuais no formato segundos desde a época (*).
X1="$(date +%s)"
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)"
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.