¿Cómo restar correctamente el tiempo en AM y PM en un script de Shell?

¿Cómo restar correctamente el tiempo en AM y PM en un script de Shell?

Me enfrento a una situación en la que supongamos que resto las 01:00:00 a. m. y las 23:00:00 p. m. usando el siguiente script. Obtengo una diferencia de 21 horas cuando son solo 2 horas.

Aquí está mi guión:

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

¿Hay una manera de lograr esto? Por favor recomiende.

EDITAR:

$DIR/sesión_$FECHA.txt

Es un archivo de sesión de Netezza con líneas similares a las que se muestran a continuación. Mostrando solo la primera línea a continuación:

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

Respuesta1

Hay tantas cosas mal en tu guión que es difícil saber por dónde empezar. Me conformaré con "estás haciendo que este camino sea más complicado de lo necesario".

Al mirar su secuencia de comandos, parece que desea saber la cantidad de horas entre a) la fecha y hora en un archivo de registro yb) ahora. Por lo tanto:

  1. necesita la fecha y hora actuales en formato de segundos desde la época (*).

    X1="$(date +%s)"
    
  2. necesita la fecha y la hora extraídas de la primera línea del archivo de registro de la sesión, también convertidas a segundos desde la época.

    X2="$(date -d "$(awk 'NR==1 {print $(NF-2),$(NF-1),$NF; nextfile}' session.txt)" +%s)"
    
  3. Debes calcular la diferencia entre esas dos fechas (X1-X2), en horas (/3600).

    let diff=(X1-X2)/3600
    

Ejemplo:

#!/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 razones históricas, la "época" se define como Medianoche del 1 de enero de 1970. "01-01-1970 00:00:00". Realmente no importa cuándo sea, es un punto de referencia común conveniente para realizar cálculos de fecha y hora usando segundos.

información relacionada