Bashの日付と時刻のループ

Bashの日付と時刻のループ

外部APIを介して昨日のログをダウンロードしようとしています。 APIの場合は、&から日付範囲を入力パラメーターとして指定する必要があります。

APIから呼び出しごとに最大1時間のログをダウンロードできます。

だから昨日の完全なログをダウンロードしたい場合。昨日の日付に基づいてAPIを24回(1時間に1回)呼び出す必要があります。

APIはGMT時間のみをサポートします。したがって、GMT時間を提供する必要があります。

たとえば:-https://abcd.com/logs?start=日付から&end=これまで

  1. 最初のサイクル以下のようにする必要があります。
  2. https://abcd.com/logs?start=2018-04-29T00:00:00Z&end=29-04-2018T00:59:59Z
  3. 2番目のループ以下のようにする必要があります
  4. https://abcd.com/logs?start=2018-04-29T01:00:00Z&end=29-04-2018T01:59:59Z
  5. 最後のループ以下のように、
  6. https://abcd.com/logs?start=2018-04-29T23:00:00Z&end=2018-04-29T23:59:59Z

このスクリプトをcronスケジュールに追加して毎日実行し、昨日の24時間ログのダウンロードが完了するようにします。

コアは

  1. いつも昨日の日
  2. 形式GMT
  3. 24サイクル

以下の回答ではエラーが発生します。現在の時間を考慮してループを実行するこのスクリプトから始めます。代わりに、ループはGMT時間00:00:00に開始する必要があります。

#!/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

ベストアンサー1

この試み。

#!/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

時々発生するうるう秒を処理できません。これを行う必要がある場合は、1日の最後の範囲がからに移動する必要があるより複雑なコードを使用してください23:00:0023:59:60ただし、ターゲットアプリケーションがこのコードも処理できることを確認してください。

#!/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

おすすめ記事