Chuyển đổi sysuptime linux sang ngày định dạng tốt


11

Tôi muốn hiển thị /proc/uptimeở định dạng tốt như:

DD:HH:MM:SS

/proc/uptime cho tôi thời gian của hệ thống tính bằng giây, có giải pháp chuẩn nào chuyển đổi giây thành định dạng này không?

Câu trả lời:


15

Đây là một cách không có perl:

awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' /proc/uptime

1
Câu trả lời chính xác. \n cho dòng mới sẽ tốt!
ankit7540

4

Bạn có thể làm điều này ví dụ với perl và một số phép toán đơn giản:

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' 

Nếu bạn không cần giây, bạn chỉ cần chạy uptimelệnh. Đầu ra của nó sau đó có thể được chuyển đổi đơn giản thành DD: HH: MM.

Ví dụ: sử dụng (chỉ hoạt động theo cách này nếu thời gian hoạt động> 1h)

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

3

Không, bởi vì nó không thực sự là một vấn đề khó khăn. Chia số giây cho 86400 bằng cách sử dụng phép chia số nguyên để lấy số ngày. Lấy phần còn lại và chia số đó cho 3600 để lấy số giờ. Chia phần còn lại cho 60 để lấy số phút và bạn còn lại với số giây. Tất cả điều này có thể thực hiện được từ shell bằng exprlệnh nếu shell của bạn đủ cổ để không hỗ trợ số học nguyên bản

Lấy số giây kể từ kỷ nguyên và biến ngày đó thành ngày có thể đọc được của con người một vấn đề khó khăn, và do đó, có những cách tiêu chuẩn để làm điều đó, ví dụ date -r SECONDStừ vỏ. Nhưng đó là một vấn đề khác.


3

Điều chỉnh phần có liên quan của câu trả lời này .

Miễn là thời gian hoạt động của bạn dưới một năm, bạn có thể sử dụng lệnh sau:

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

Tôi trích xuất trường đầu tiên của tệp thời gian hoạt động, vì ít nhất trên Linux của tôi, có trường thứ hai chứa tổng thời gian nhàn rỗi. Tôi coi đó là số giây kể từ kỷ nguyên, và chuyển đổi nó thành ngày trong năm theo sau là thời gian tính bằng giờ, phút và giây. Vì ngày trong năm bắt đầu từ một, tôi trừ đi một trong số đó trong lần awkgọi cuối cùng của tôi .


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

Chuyển đổi giây kể từ kỷ nguyên sang ngày và giờ:

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.