Bash: calcula o tempo decorrido entre dois timestamps

0

Eu escrevi um script que me notifica quando um valor não está dentro de um determinado intervalo. Todos os valores "fora dos intervalos" são registrados em um conjunto de arquivos por dia. Cada linha é timestamped de maneira reversa proprietária:     yyyymmddHHMMSS

Agora, eu gostaria de refinar o script e receber notificações apenas quando pelo menos 60 minutos forem passados desde a última notificação para o valor dado fora do intervalo. Eu já resolvi o problema para imprimir os logs de forma ordenada inversa com:

for i in $(ls -t /var/log/logfolder/*); do zcat $i|tac|grep \!\!\!|grep --color KEYFORVALUE; done

que resulta em:

...
20170817041001 - WARNING: KEYFORVALUE=252.36 is not between 225 and 245 (!!!)
20170817040001 - WARNING: KEYFORVALUE=254.35 is not between 225 and 245 (!!!)
20170817035001 - WARNING: KEYFORVALUE=254.55 is not between 225 and 245 (!!!)
20170817034001 - WARNING: KEYFORVALUE=254.58 is not between 225 and 245 (!!!)
20170817033001 - WARNING: KEYFORVALUE=255.32 is not between 225 and 245 (!!!)
20170817032001 - WARNING: KEYFORVALUE=254.99 is not between 225 and 245 (!!!)
20170817031001 - WARNING: KEYFORVALUE=255.95 is not between 225 and 245 (!!!)
20170817030001 - WARNING: KEYFORVALUE=255.43 is not between 225 and 245 (!!!)
20170817025001 - WARNING: KEYFORVALUE=255.26 is not between 225 and 245 (!!!)
20170817024001 - WARNING: KEYFORVALUE=255.42 is not between 225 and 245 (!!!)
20170817023001 - WARNING: KEYFORVALUE=254.49 is not between 225 and 245 (!!!)
20170817022001 - WARNING: KEYFORVALUE=253.13 is not between 225 and 245 (!!!)
20170817021001 - WARNING: KEYFORVALUE=252.75 is not between 225 and 245 (!!!)
20170817020001 - WARNING: KEYFORVALUE=252.64 is not between 225 and 245 (!!!)
20170817015001 - WARNING: KEYFORVALUE=252.71 is not between 225 and 245 (!!!)
20170817014001 - WARNING: KEYFORVALUE=252.97 is not between 225 and 245 (!!!)
20170817013001 - WARNING: KEYFORVALUE=252.17 is not between 225 and 245 (!!!)
20170817012001 - WARNING: KEYFORVALUE=252.04 is not between 225 and 245 (!!!)
...

De qualquer forma, estou empenhado em encontrar o caminho para calcular o tempo passado entre dois desses timestamps, por exemplo:

20170817040001
20160312000101

Eu acho que seria teoricamente possível converter tudo no menor valor (segundos), mas seria realmente uma dor, e eu não saberia como lidar com casos especiais como 29 de fevereiro a cada quatro anos, e eu ignore se houver outros também!

O que devo fazer para calcular o tempo que passou entre dois desses timestamps?

    
por Marco 18.08.2017 / 18:18

2 respostas

3

Isso lhe dará a data em segundos (desde a época do UNIX)

date --date '2017-08-17 04:00:01' +%s    # "1502938801"

E isso lhe dará a data como uma string legível de um número de segundos

date --date '@1502938801'    # "17 Aug 2017 04:00:01"

Portanto, tudo o que é necessário é converter sua data / registro de data e hora em um formato que o GNU date possa entender, usar a matemática para determinar a diferença e gerar o resultado

datetime1=20170817040001
datetime2=20160312000101

seconds1=$(date --date "$(echo "$datetime1" | sed -nr 's/(....)(..)(..)(..)(..)(..)/-- ::/p')" +%s)
seconds2=$(date --date "$(echo "$datetime2" | sed -nr 's/(....)(..)(..)(..)(..)(..)/-- ::/p')" +%s)

delta=$((seconds1 - seconds2))
echo "$delta seconds"    # "45197940 seconds"

Não fornecemos informações de fuso horário aqui para que ele assuma o fuso horário local. Seus valores para os segundos do datetime provavelmente serão diferentes dos meus. (Se seus valores forem UTC, você poderá usar date --utc .)

    
por 18.08.2017 / 18:30
4

Isso é fácil com o comando datediff fornecido no pacote dateutils .

ddiff -i '%Y%m%d%H%M%S' 20170817040001 20160312000101
    
por 18.08.2017 / 19:30