Converter sysuptime linux em formato de data bem

11

Quero exibir /proc/uptimeno formato bem como:

DD:HH:MM:SS

/proc/uptime desistir do tempo do sistema em segundos, existe uma solução padrão que converte segundos para esse formato?

Navid Farhadi
fonte

Respostas:

15

Aqui está uma maneira sem perl:

awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}' /proc/uptime
mindc
fonte
1
Ótima resposta. \n para nova linha seria bom!
ankit7540
4

Você pode fazer isso, por exemplo, com perl e algumas contas simples:

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' 

Se você não precisar dos segundos, basta executar o uptimecomando. Sua saída pode ser simplesmente transformada em DD: HH: MM.

Por exemplo, usando (funciona dessa maneira apenas se o tempo de atividade for> 1h)

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

Não, porque não é realmente um problema difícil. Divida o número de segundos por 86400 usando a divisão inteira para obter o número de dias. Pegue o restante e divida-o por 3600 para obter o número de horas. Divida o restante disso por 60 para obter o número de minutos e você ficará com o número de segundos. Tudo isso é possível a partir do shell usando o exprcomando se o seu shell for antigo o suficiente para não suportar aritmética nativamente

Tomar o número de segundos desde a época e transformá-lo em uma data legível por humanos é um problema difícil, e, portanto, existem maneiras padrão de fazer isso, por exemplo, a date -r SECONDSpartir do shell. Mas isso é um problema diferente.

Kyle Jones
fonte
3

Adaptando a parte relevante desta resposta .

Desde que seu tempo de atividade seja inferior a um ano, você pode usar o seguinte comando:

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

Eu extraio o primeiro campo do arquivo de tempo de atividade, pois pelo menos no meu Linux, há um segundo campo que contém o tempo total ocioso. Trato isso como o número de segundos desde a época e o converto no dia do ano, seguido do tempo em horas, minutos e segundos. Como o dia do ano começa às uma, subtraio um daquele em minha awkinvocação final .

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

Convertendo segundos desde a época em data e hora:

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