
Я сталкиваюсь с ситуацией, когда, предположим, я вычитаю 01:00:00 AM и 23:00:00 PM, используя мой скрипт ниже, и получаю разницу в 21 час, хотя на самом деле она составляет всего 2 часа.
Вот мой сценарий:
#!/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_$ДАТА.txt
это файл сессии netezza с похожими строками, как ниже. Показана только первая строка ниже:
26195 sql-odbc XXX 27-May-21 01:18:51 CDT
решение1
В вашем сценарии так много ошибок, что трудно понять, с чего начать. Я соглашусь на «вы делаете это более сложным, чем это необходимо».
Глядя на ваш скрипт, кажется, что вы хотите узнать количество часов между а) датой и временем в файле журнала и б) настоящим моментом. Поэтому:
вам нужны текущие дата и время в формате секунд с начала эпохи(*).
X1="$(date +%s)"
вам необходимо извлечь дату и время из первой строки файла журнала сеанса, а также преобразовать их в секунды с начала эпохи.
X2="$(date -d "$(awk 'NR==1 {print $(NF-2),$(NF-1),$NF; nextfile}' session.txt)" +%s)"
Вам необходимо рассчитать разницу между этими двумя датами (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
(*) по историческим причинам «эпоха» определяется как полночь 1 января 1970 года. «01-01-1970 00:00:00». Неважно, когда это произойдет, это удобная общая точка отсчета для выполнения расчетов даты и времени с использованием секунд.