Como fazer a análise do tempo decorrido em segundos no linux

0

Eu quero fazer a análise do tempo decorrido em segundos. Formatos de tempo fornecidos abaixo:

1) 3 day 18h
2) 3 day
3) 3h 15min
4) 3h 
5) 15min 10sec
6) 15min 
7) 10sec

Estou recebendo valores de systemctl status cassandra | awk '/(Active: active)/{print $9, $10,$11}' Agora armazenando o valor na variável A, como

A=$(systemctl status cassandra | awk '/(Active: active)/{print $9, $10,$11}'

agora A tem entrada como 3 day 18h ou 3 day etc. Mais exemplos -

A=3 day 18h or 3 day or 3h 15min or 3h or 15min 10sec or 15min or 10sec

agora pegue valores diferentes de A e analise em segundos.

    
por Parul Chourasia 25.04.2018 / 09:25

2 respostas

1

Não podemos depender dos parâmetros de dias e horas, porque após 7 dias teremos o parâmetro week e após 30 dias teremos o parâmetro month.

Então é melhor calcular com o tempo de início do serviço.

#!/bin/bash
SERVICE=cassandra
SERVICE_START_TIME='systemctl status $SERVICE | awk '/Active: active/{print $6" "$7}''
SERVICE_UP_TIME=$(($(date +%s) - $(date -d "$SERVICE_START_TIME" +%s)))
echo "$SERVICE uptime : $SERVICE_UP_TIME"

você pode tentar o seguinte one-liner, mas sugiro o código acima para obter o resultado exato.

systemctl status cassandra | awk -F ';' '/Active: active/{print $2}' |  sed -e 's/s ago/ 1/; s/s//g; s/min/ 60/; s/h ago/ 3600/; s/day/86400/; s/week/606800/; s/month/2592000/; s/ago//' | awk '{a=$1*$2;b=$3*$4;c=$a+$b;print a" sec"}'
    
por 25.04.2018 / 11:00
1

Você pode usar o comando date para analisar esses valores da seguinte forma:

        adjusted_val="$(printf '%s' "$val" | sed 's/h/hour/')"
        result="$(date -d "$(date -d @0) + $adjusted_val" +%s)"

Curiosamente, date não reconhece h (ou mesmo hr ) como uma abreviação para "hora", Portanto, como primeiro passo, substituímos h na string por hour . Então encontramos “o tempo da época” - a data / hora a partir da qual a data / hora do Unix é contada - expandindo @0 (tempo Unix 0) como uma string. (Este bem conhecido e documentado para ser "01 de janeiro de 1970 00:00:00 GMT", então poderíamos codificar esse valor.) Em seguida, adicionamos sua string: por exemplo, (1º de janeiro) + 3 dia (s) é 4 de janeiro. Em seguida, usamos +%s para exibir essa data / hora como data / hora numérica do Unix, qual é o número de segundos após a época. Isso corresponde ao valor do intervalo (delta) da sua string.

Se você quiser fazer muitos valores de uma só vez, você pode otimizar isso computando a época apenas uma vez:

#!/bin/sh
epoch="$(date -d @0)"
for val
do
        adjusted_val="$(printf '%s' "$val" | sed 's/h/hour/')"
        if result="$(date -d "$epoch + $adjusted_val" +%s)"
        then
                printf '%-12s -> %6d\n' "$val" "$result"
        else
                printf '%-12s <- error\n' "$val"
        fi
done

resultados:

$ ./myscript '3 day 18h' '3 day' '3h 15min' '3h' '15min 10sec' '15min ' \
                                                       '10sec' 'a moment' '3 weeks'
3 day 18h    -> 324000
3 day        -> 259200
3h 15min     ->  11700
3h           ->  10800
15min 10sec  ->    910
15min        ->    900
10sec        ->     10
date: invalid date ‘Wed, Dec 31, 1969  7:00:00 PM + a moment’
a moment     <- error
3 weeks      -> 1814400

Observe que date -d pode manipular a palavra "mês". Se houver a possibilidade de você receber valores contendo essa palavra, você precisará tornar o comando sed mais inteligente, por isso não muda o "h" em "mês".

    
por 25.04.2018 / 22:22