Преобразовать строку времени работы звездочки в дату - PullRequest
0 голосов
/ 15 октября 2019

как я могу преобразовать «Время работы системы: 2 дня, 9 часов, 16 минут, 5 секунд» в дату bash?

Я хочу сравнить эту дату с другой.

Спасибо заранее.

Ответы [ 3 ]

1 голос
/ 15 октября 2019

При условии, что сообщение всегда будет содержать все компоненты даты в фиксированных местах, метка времени Unix (секунды после эпохи) может быть рассчитана с использованием.

# Set t from command, or file.
t="System uptime: 2 days, 9 hours, 16 minutes, 5 seconds"
# Split into words
read -a p <<< "$t"
# Uptime in seconds
uptime=$((p[2]*24*60*60+p[4]*60*60+p[6]*60+p[8]))
now=$(date '+%s')
up_ts=$((now-uptime))
echo "Timestamp: $up_ts"
# Convert to human readable date.
up_date=$(date +'%Y-%m-%d %H:%M:%S' -d "@$up_ts")
echo "Date: $up_date"

Вы также можете использовать встроенное в bash форматирование даты в 'up_ts'.

Если формат сообщения времени доступности зависит от значений (например, дни не включаются, еслиuptime <1 день), потребуется дополнительный анализ. </p>

1 голос
/ 15 октября 2019

Здесь вы найдете надежный способ, который преобразует вашу продолжительность в общее количество секунд. Это надежно, так как не требуется перечислять все количества. Т.е. выход может быть любым из следующих:

 System uptime: 16 minutes, 2 seconds
 System uptime: 12 days, 3 seconds
 System uptime: 15minutes,12hours
  1. Создать файл convert.awk, который содержит

    BEGIN { a["seconds"]=1; a["minutes"]=60
            a["hours"]=3600; a["days"]=86400;
            a["weeks"]=7*86400 }
    { tmp=tolower($0) }
    { while (match(tmp,/[0-9]+[^a-z]*[a-z]+/)) {
        u=substr(tmp,RSTART,RLENGTH); q=u+0; gsub(/[^a-z]/,"",u)
        t+=q*a[u]
        tmp=substr(tmp,RSTART+RLENGTH)
      }
      print t
    }
    
  2. Запуститьследующая команда:

    $ echo "System uptime: 2 days, 9 hours, 16 minutes, 5 seconds" | awk -f convert.awk
    206165
    $ echo "System uptime: 2 weeks, 9 days, 16 minutes, 5 seconds" | awk -f convert.awk
    1988165
    

Как это работает:

Когда мы читаем строку, например.

tmp="system uptime: 16 minutes, 2 seconds"

Команда match будет искать любую подстроку, которая начинается с цифр и заканчивается строкой символов. match автоматически установит переменные RSTART и RLENGTH в положение найденной подстроки и ее длину. Таким образом, команда u=substr(tmp,RSTART,RLENGTH) установит

u="16 minutes"

Теперь вы можете просто выполнить операцию над ней, чтобы извлечь первое число. Это работает с awk, так как преобразует любую строку, начинающуюся с чисел, в число, игнорируя что-либо после него. Итак, q=u+0 создает

q=16

Наконец, мы удаляем все, что не является символом из u, что приводит к

u="minutes"

. Следующим шагом мы переопределяем tmp, удаляя всемы уже обработали.

tmp=", 2 seconds"

и начнем процесс заново.

0 голосов
/ 15 октября 2019

Обратите внимание, что команда uptime получает данные от /proc/uptime

Таким образом, один из подходов состоит в том, чтобы получить первое значение поля, которое представляет собой общее прошедшее время в секундах, и передать его в команду date:-

вот пример: -

$ cat /proc/uptime
8743161.15 7738916.50

$ date -d'-8743161.15 seconds'
Sat Jul  6 06:00:37 EDT 2019
...