Конвертируйте linux sysuptime в форматирование даты

11

Я хочу отобразить /proc/uptimeв хорошем формате как:

DD:HH:MM:SS

/proc/uptime дайте мне время системы в секундах, есть ли стандартное решение, которое конвертирует секунды в этот формат?

Навид Фархади
источник

Ответы:

15

Вот способ без perl:

awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' /proc/uptime
mindc
источник
1
Отличный ответ. \n для новой строки было бы хорошо!
ankit7540 22.12.16
4

Вы можете сделать это, например, с помощью Perl и некоторой простой математики:

cat /proc/uptime |  perl -ne '/(\d*)/ ; printf "%02d:%02d:%02d:%02d\n",int($1/86400),int(($1%86400)/3600),int(($1%3600)/60),$1%60' 

Если вам не нужны секунды, вы можете просто запустить uptimeкоманду. Затем его выходной сигнал может быть просто преобразован в DD: HH: MM.

Например, используя (работает таким образом, только если uptime> 1h)

 uptime | perl -ne '/(\d*) day[^\d]*(\d*):(\d*)/ ; printf "%02d:%02d:%02d\n", $1, $2, $3'
jofel
источник
3

Нет, потому что это не очень сложная проблема. Разделите количество секунд на 86400, используя целочисленное деление, чтобы получить количество дней. Возьмите остаток и разделите его на 3600, чтобы получить количество часов. Разделите остаток от этого на 60, чтобы получить количество минут, и у вас останется количество секунд. Все это выполнимо из оболочки с помощью exprкоманды, если ваша оболочка достаточно древняя, чтобы изначально не поддерживать арифметику

Взятие количества секунд с начала эпохи и превращение их в удобочитаемую дату - сложная проблема, и поэтому существуют стандартные способы сделать это, например, date -r SECONDSиз оболочки. Но это другая проблема.

Кайл Джонс
источник
3

Адаптация соответствующей части этого ответа .

До тех пор, пока вы работаете менее года, вы можете использовать следующую команду:

TZ=UTC date -d@$(cut -d\  -f1 /proc/uptime) +'%j %T' | awk '{print $1-1"d",$2}'

Я извлекаю первое поле файла uptime, так как, по крайней мере, в моем Linux есть второе поле, содержащее общее время простоя. Я рассматриваю это как количество секунд, прошедших с начала эпохи, и преобразовываю их в день года с последующим временем в часах, минутах и ​​секундах. Так как день года начинается в один, я вычитаю один из них в моем последнем awkобращении.

MVG
источник
2
$ s=12345678
$ printf '%d:%02d:%02d:%02d\n' $((s/86400)) $((s/3600%24)) $((s/60%60)) $((s%60))
142:21:21:18

Преобразование секунд с начала эпохи в дату и время:

$ gdate -d @1234567890 '+%F %T' # GNU date
2009-02-14 01:31:30
$ date -r 1234567890 '+%F %T' # BSD date
2009-02-14 01:31:30
LRI
источник