calculo usando o bc

1. calculo usando o bc

Morpheus
Minions

(usa Nenhuma)

Enviado em 29/07/2023 - 15:01h


# Tem como o bc fica igual ao gnome-disk-utility

Ex: 4 anos, 2 meses e 12 dias

=========================================

No bc ate agora:

smartctl --all /dev/sda | grep "Power_On_Hours"

Horas: 36823

Anos: 4.203529565

O problema é chegar nos valores dos meses e dias, o ano podemos usar o " cut -d. -f1"



  


2. Re: calculo usando o bc

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 29/07/2023 - 15:01h

Olá, para calcular o tempo com precisão de anos, meses e dias a partir do total de horas, você pode usar um conjunto de comandos Unix juntamente com o bc. Segue abaixo um exemplo de como você pode fazer isso:

#
tempo_total_em_horas=36823
horas_por_dia=24
dias_por_mes=30
meses_por_ano=12

anos=$(echo "$tempo_total_em_horas/($horas_por_dia*$dias_por_mes*$meses_por_ano)" | bc)
meses=$(echo "($tempo_total_em_horas%($horas_por_dia*$dias_por_mes*$meses_por_ano))/($horas_por_dia*$dias_por_mes)" | bc)
dias=$(echo "($tempo_total_em_horas%($horas_por_dia*$dias_por_mes))/($horas_por_dia)" | bc)

echo "$anos anos, $meses meses e $dias dias."


Este script realiza os seguintes cálculos:

- O número de anos é obtido dividindo o total de horas pelo número de horas em um ano.
- O número de meses é obtido calculando o resto da divisão do total de horas pelo número de horas em um ano e dividindo isso pelo número de horas em um mês.
- O número de dias


3. Re: calculo usando o bc

aguamole
aguamole

(usa KUbuntu)

Enviado em 29/07/2023 - 15:35h

@alexabolada o bash é limitado em dar o resultado como por exemplo: 91.800 segundos como saída sendo 25h e 30min e 30seg?
O Bash puro é capas de resolver isso?


4. Re: calculo usando o bc

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 29/07/2023 - 15:35h

Olá! Sim, o bash é capaz de resolver isso. Você pode usar a matemática do bash para converter as horas, minutos e segundos. Veja o exemplo:


#!/bin/bash

# Tempo total em segundos
TEMPO_TOTAL_SEG=91800

HORAS=$((TEMPO_TOTAL_SEG/3600))
RESTO=$((TEMPO_TOTAL_SEG%3600))
MINUTOS=$((RESTO/60))
SEGUNDOS=$((RESTO%60))

echo "$HORAS horas, $MINUTOS minutos e $SEGUNDOS segundos"


No exemplo acima, 3600 é o número de segundos em uma hora e 60 é o número de segundos em um minuto. A operação % é a operação de módulo, que retorna o resto de uma divisão.

O comando echo adiante apresenta a conversão do tempo total em segundos para o formato de "horas minutos e segundos".


5. Re: calculo usando o bc

Morpheus
Minions

(usa Nenhuma)

Enviado em 29/07/2023 - 17:05h

@alexabolada

Na variável $dias_por_mes os valores pode variar de 29, 30 e 31 dias o mês.

dias_por_mes="30"

Não podemos colocar uma variável dia do mês como uma variável constante.

horas ligado = 36822

O valor "4 anos, 3 meses e 4 dias." não esta batendo com o valor de "4 anos, 2 meses e 12 dias" do gnome-disk-utility


6. Re: calculo usando o bc

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 29/07/2023 - 17:06h

Olá!

Primeiramente, vamos entender seu problema. A variável $dias_por_mes não pode ser constante, pois a quantidade de dias pode mudar dependendo do mês.

Para solucionar isso no shell script, você pode usar uma estrutura de controle do tipo case...esac para definir o valor da variável $dias_por_mes de acordo com o mês corrente. O exemplo a seguir demonstra como fazer isso:


mes=`date +%m`

case $mes in
"01"|"03"|"05"|"07"|"08"|"10"|"12")
dias_por_mes=31
;;
"04"|"06"|"09"|"11")
dias_por_mes=30
;;
"02")
dias_por_mes=28 # Considera o mês de Fevereiro não bissexto
;;
esac


Quanto ao problema com a divergência de horas ligado indicadas pelo gnome-disk-utility, precisamos de mais alguns detalhes para entender melhor esse caso:

1. Você pode compartilhar conosco como você está calculando o tempo ligado e qual é o comando que você está utilizando?
2. As informações apresentadas pelo gnome-disk-utility estão atualizadas?

Além disso, é importante saber que a indicação "4 anos, 3 meses e


7. Re: calculo usando o bc

Paulo
paulo1205

(usa Ubuntu)

Enviado em 30/07/2023 - 20:06h

“Anos” e “meses” não são unidades muito precisas.

O que é um mês decorrido? É o tempo entre o dia 30 do mês passado e o dia 30 do mês corrente (30 só porque é dia 30 de julho no momento em que eu escrevo)? Se sim, então pode ter variação numa conversão de qualquer outra unidade para esta, e vice-versa.

Fora as anomalias: e se o mês passado tivesse sido janeiro, e eu comecei a contar no dia 30, quando acaba o mês? e se tivesse sido fevereiro, e hoje fosse 30 de março, quando eu teria de começar a contar o mês que passou?

Análogo para anos. Fora tipos de calendários diferentes, para os quais o ano pode ter desde 346 até mais de 400 dias de duração, mesmo no calendário gregoriano temos anos com durações diferentes, e uma duração média que não corresponde a uma quantidade inteira de dias


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


8. Re: calculo usando o bc

aguamole
aguamole

(usa KUbuntu)

Enviado em 30/07/2023 - 21:17h

Cara hora dia anos é loucura, eles podiam ter colocado a cada virada de 99 adicionasse 1 na frente sendo 100, mas não, tiveram que dificultar uma coisa que era para ser simples como 99h 99min 99seg e mais 1 seg virava 1dia. sem condição.
Conseguiram transformar uma coisa simples em uma coisa complexa.

Eu estava vendo um vídeo uma vez do safesrc explicando a trabalheira que é manter um sistema assim.


9. Re: calculo usando o bc

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 31/07/2023 - 00:18h

Sugestão, com o awk.
cat idade.awk
BEGIN {
a=31556952;d=86400;h=3600
}

{
T = ($1 - $2)
Y = int(T / a)
D = int((T % a) / d)
H = int(int(T % 86400) / 3600)
M = int((T % 3600) / 60)
S = int((T % 3600) % 60)
printf "%s Anos, %03d dias, %02d horas, %02d minutos e %02d segundos.\n", Y, D, H, M, S
}


#a=31556952, explicação no link abaixo.
#https://pt.wikipedia.org/wiki/Ano#:~:text=No%20Calend%C3%A1rio%20Gregoriano%20o%20ano,dias%20%3D%20365%2C2425%20dias.

date -d'1974-07-30 12:00:00' +%s
144428400 #UTS inicial

awk -f idade.awk <<< "$(printf '%(%s)T') 144428400" 
[b]#Exenplo
00:03:08 #Hora da execução do comando.
49 Anos, 000 dias, 12 horas, 03 minutos e 08 segundos #Resposta

Uso
awk -f idade.awk <<< 'data_fim data_inicio'
Obs.: Data inicio/fim, em uts, conforme exemplo acima.
FIM > INICIO
Só tem um pequeno "defeito..... :)"


______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts