Data e hora loop no bash

1

Estou tentando fazer o download dos registros de ontem por meio de uma API externa. Para API, preciso fornecer um intervalo de datas de & como parâmetros de entrada.

Da API, posso fazer o download do log máximo de 1 hora para cada chamada.

Então, se eu quiser baixar ontem o log completo. Eu preciso chamar a API por 24 vezes com a data de ontem (a cada hora).

Observação: a API suportará apenas o horário GMT. Então, precisamos fornecer o horário GMT.

Eg :- https://abcd.com/logs?start=FROM_DATE&end=TO_DATE

  1. Primeiro ciclo de tempo , deve seguir abaixo,
  2. link 29-04-2018T00: 00: 00Z & end = 29-04 -2018T00: 59: 59Z
  3. Segundo ciclo de tempo deve ser como abaixo
  4. link 29-04-2018T01: 00: 00Z & end = 29-04 -2018T01: 59: 59Z
  5. Último loop de tempo , como abaixo,
  6. link 29-04-2018T23: 00: 00Z & end = 29-04 -2018T23: 59: 59Z

Este script eu adicionarei no cronograma, então todos os dias uma vez que ele será acionado e baixe ontem o log de 24 horas completo.

Os principais pontos são

  1. Data de ontem sempre
  2. Formatar GMT
  3. 24 vezes loop

Espero que esteja claro. As respostas abaixo mencionadas estão jogando erro. Eu comecei com este script, está considerando a hora atual e fazendo o loop. Em vez desse loop precisa começar com a hora 00:00:00 GMT. Alguém por favor me ajude.

#!/bin/bash
FROM_DATE=$(date -u -d "1 day ago" +%Y-%m-%d"T"%H":00:00""Z")
for i in {0..3}
  do
    echo "FROM_DATE : $FROM_DATE"
    TO_DATE=$(date -u +%Y-%m-%d"T"%H":59:59""Z" -d "1 day ago""$date + $i hour")
    echo "TO_DATE : $TO_DATE"
    FROM_DATE=$(date -u +%Y-%m-%d"T"%H":00:00""Z" -d "1 day ago""$date + $i hour""$date + 1 hour")
  done
    
por Jhony 27.04.2018 / 14:05

2 respostas

1

Tente isso.

#!/bin/bash
#
yesterday=$(date --utc --date 'yesterday' +'%Y-%m-%d')
for hour in {0..23}
do
    printf "https://abcd.com/logs?start=%sT%02d:00:00Z&end=%sT%02d:59:59Z\n" $yesterday $hour $yesterday $hour
done

Não aguenta os ocasionais segundos bissextos. Se você precisar disso, use este código mais complexo, em que o último intervalo do dia pode precisar ir de 23:00:00 a 23:59:60 , mas garanta que seu aplicativo de destino também possa lidar com isso:

#!/bin/bash
#
yesterday=$(date --utc --date 'yesterday' +'%Y-%m-%d')
leapsecond=$(date --utc --date @$(( $(date --utc --date '00:00:00' +%s) -1 )) +'%S')
lastsecond=59

for hour in {0..23}
do
    [[ hour == 23 ]] && lastsecond=$leapsecond
    printf "https://abcd.com/logs?start=%sT%02d:00:00Z&end=%sT%02d:59:%02dZ\n" $yesterday $hour $yesterday $hour $lastsecond
done
    
por 27.04.2018 / 15:09
0

Estou obtendo o resultado esperado.

#!/bin/bash
for i in {00..23}
do FROM_DATE=$(date -u -d "1 day ago" +%Y-%m-%d"T"$i":00:00Z")
echo "FROM_DATE:" $FROM_DATE | tr -d '\r'
TO_DATE=$(date -u +%Y-%m-%d"T"$i":59:59Z" -d "1 day ago")
echo "TO_DATE : $TO_DATE" | tr -d '\r'
done

Muito obrigado pela sua ajuda

    
por 30.04.2018 / 13:19