Konversi linux sysuptime ke format tanggal dengan baik

11

Saya ingin menampilkan /proc/uptimedalam format yang baik sebagai:

DD:HH:MM:SS

/proc/uptime beri saya waktu sistem dalam detik, apakah ada solusi standar yang mengubah detik ke format ini?

Navid Farhadi
sumber

Jawaban:

15

Inilah jalan tanpa perl:

awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' /proc/uptime
mindc
sumber
1
Jawaban yang bagus \n untuk baris baru akan bagus!
ankit7540
4

Anda dapat melakukan ini misalnya dengan perl dan beberapa matematika sederhana:

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' 

Jika Anda tidak membutuhkan detik, Anda dapat menjalankan uptimeperintah. Keluarannya kemudian dapat diubah menjadi DD: HH: MM.

Misalnya menggunakan (berfungsi dengan cara ini hanya jika waktu aktif> 1 jam)

 uptime | perl -ne '/(\d*) day[^\d]*(\d*):(\d*)/ ; printf "%02d:%02d:%02d\n", $1, $2, $3'
Jofel
sumber
3

Tidak, karena itu bukan masalah yang sulit. Bagi jumlah detik dengan 86400 menggunakan divisi integer untuk mendapatkan jumlah hari. Ambil sisanya dan bagi dengan 3600 untuk mendapatkan jumlah jam. Bagi sisanya dengan 60 untuk mendapatkan jumlah menit, dan Anda tersisa dengan jumlah detik. Semua ini dapat dilakukan dari shell menggunakan exprperintah jika shell Anda cukup kuno untuk tidak mendukung aritmatika secara asli

Mengambil jumlah detik sejak zaman dan mengubahnya menjadi tanggal yang dapat dibaca manusia adalah masalah yang sulit, dan ada cara standar untuk melakukan itu, misalnya date -r SECONDSdari shell. Tapi itu masalah yang berbeda.

Kyle Jones
sumber
3

Adaptasi bagian yang relevan dari jawaban ini .

Selama waktu aktif Anda kurang dari satu tahun, Anda dapat menggunakan perintah berikut:

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

Saya mengekstrak bidang pertama dari file uptime, karena setidaknya di Linux saya, ada bidang kedua yang berisi total waktu idle. Saya menganggap itu sebagai jumlah detik sejak zaman, dan mengubahnya menjadi hari tahun diikuti oleh waktu dalam jam, menit dan detik. Karena hari tahun dimulai pukul satu, saya kurangi satu dari itu dalam awkdoa terakhir saya .

MvG
sumber
2
$ s=12345678
$ printf '%d:%02d:%02d:%02d\n' $((s/86400)) $((s/3600%24)) $((s/60%60)) $((s%60))
142:21:21:18

Konversi detik sejak zaman ke tanggal dan waktu:

$ 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
sumber