Вычислить разницу между двумя отметками времени в bash - PullRequest
2 голосов
/ 28 мая 2020

Я хочу узнать общее время загрузки системы, вычтя две отметки времени. Сначала я использую эту команду, чтобы получить время начала и время окончания:

sudo journalctl | grep "Logs begin at" | awk '{print $6" "$7" "$12" "$13}'

, что дает мне следующий результат:

2020-05-21 05:52:47 2020-05-28 19:37:36

(первые два поля - время начала и последние два поля - время окончания)

Теперь я хочу найти разницу между временем начала и временем окончания, желательно в формате:

"0 год (лет), 0 месяц ( с), 7 дн., ЧЧ: ММ: СС "

Ответы [ 3 ]

3 голосов
/ 28 мая 2020

Что насчет этого?

#!/usr/bin/env bash
echo "BASH_VERSION:" $BASH_VERSION 

line="2020-05-21 05:52:47;2020-05-28 19:37:36"
IFS=';' read -a dates <<< $line
startDatetime=${dates[0]}
endDatetime=${dates[1]}

echo "| dates -> " ${dates[@]}
echo "|> startDatetime -> ${startDatetime}"
echo "|> endDatetime -> ${endDatetime}"

startTime=$(date -jf "%Y-%m-%d %H:%M:%S" "${startDatetime}" +%s)
endTime=$(date -jf "%Y-%m-%d %H:%M:%S" "${endDatetime}" +%s)
diffSeconds="$(($endTime-$startTime))"

echo "Diff in seconds: $diffSeconds"
# at this point you have the diff in seconds and you can parse it however you want :)

diffTime=$(gdate -d@${diffSeconds} -u +%H:%M:%S) # you'll need `brew install coreutils`
echo "Diff time(H:M:S): $diffTime"

Вывод:

BASH_VERSION: 5.0.17(1)-release
| dates ->  2020-05-21 05:52:47 2020-05-28 19:37:36
|> startDatetime -> 2020-05-21 05:52:47
|> endDatetime -> 2020-05-28 19:37:36
Diff in seconds: 654289
Diff time(H:M:S): 13:44:49

Для установки последней bash я нашел этот средний пост .

Примечание: если это не сработает из-за несовместимости версий с функцией date, например, идея должна быть очень похожей, и вы можете найти обходной путь, который адаптируется к вашей текущей версии, я конечно. С логической точки зрения, самое простое решение, которое я вижу:

1-й) Разделите строку на две: по одной для каждого DateTimes.

2-й) Преобразуйте каждый DateTime из строки в даты.

3-й) Примените разницу между этими датами: используя секунды от каждой.

4-й) Имея разницу в секундах, вы можете отображать ее как хотите (год, дни, минуты, секунды)

2 голосов
/ 28 мая 2020

Та же версия, что и @chemaclass, но на этот раз для Ubuntu (16.04 LTS).

#!/usr/bin/env bash
echo "BASH_VERSION:" $BASH_VERSION 

line="2020-05-21 05:52:47;2020-05-28 19:37:36"
IFS=';' read -a dates <<< $line
startDatetime=${dates[0]}
endDatetime=${dates[1]}

echo "| dates -> " ${dates[@]}
echo "|> startDatetime -> ${startDatetime}"
echo "|> endDatetime -> ${endDatetime}"


startTime=$(date -d "${startDatetime}" +%s)
endTime=$(date -d "${endDatetime}" +%s)
diffSeconds="$(($endTime-$startTime))"

echo "Diff in seconds: $diffSeconds"
# at this point you have the diff in seconds and you can parse it however you want :)

diffTime=$(date -d @${diffSeconds} +"%H:%M:%S" -u)
echo "Diff time(H:M:S): $diffTime"

Вывод:

BASH_VERSION: 5.0.0(1)-release
| dates ->  2020-05-21 05:52:47 2020-05-28 19:37:36
|> startDatetime -> 2020-05-21 05:52:47
|> endDatetime -> 2020-05-28 19:37:36
Diff in seconds: 654289
Diff time(H:M:S): 13:44:49

Я обновил bash до версии 5.0.0 после этот учебник . По умолчанию bash версия (4.4.20) не работает. Вы получите сообщение об ошибке, например: redirection unexpected в строке 3 из-за символа <<<.

0 голосов
/ 28 мая 2020

Возможный подход:

#!/bin/bash

strSTARTTIME="2020-05-21 05:52:47"
strENDTIME="2020-05-28 19:37:36"

STARTTIME=$(date -d "${strSTARTTIME}" +%s)
ENDTIME=$(date -d "${strENDTIME}" +%s)

RUNTIME=$((ENDTIME-STARTTIME))

echo "Seconds ${RUNTIME} in sec"

Дальнейшие вычисления и форматирование я оставлю на вашей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...