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
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?
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'
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.
$ 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
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
.