Converte o sysuptime do linux para a data do formato do poço

11

Eu quero mostrar /proc/uptime no formato do poço como:

DD:HH:MM:SS

/proc/uptime me dá tempo do sistema em segundos, existe uma solução padrão que converte segundos para este formato?

    
por Navid Farhadi 12.03.2012 / 16:53

5 respostas

14

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
    
por 12.03.2012 / 22:20
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 comando uptime . Sua saída pode então ser simplesmente transformada em DD: HH: MM.

Por exemplo, usando (funciona desta forma apenas se uptime > 1h)

 uptime | perl -ne '/(\d*) day[^\d]*(\d*):(\d*)/ ; printf "%02d:%02d:%02d\n", $1, $2, $3'
    
por 12.03.2012 / 17:38
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 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 é factível a partir do shell usando o comando expr se o seu shell é 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 em humanos é um problema difícil, e, portanto, há maneiras padrão de fazer isso, por exemplo, date -r SECONDS do shell. Mas esse é um problema diferente.

    
por 12.03.2012 / 17:49
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 para uma 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
    
por 26.03.2014 / 15:32
2

Adaptar a parte relevante da esta resposta .

Contanto que seu tempo de atividade seja menor que 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, já que pelo menos no meu Linux, existe um segundo campo contendo o tempo ocioso total. Eu trato isso como o número de segundos desde a época, e converto isso para o dia do ano seguido pelo tempo em horas, minutos e segundos. Desde o dia do ano começa em um, eu subtraio um daquele na minha invocação final de awk .

    
por 02.12.2014 / 10:59