web-dev-qa-db-ja.com

bashの日付と時刻のループ

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

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

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

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

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

  1. 初回ループ以下のようになります、
  2. https://abcd.com/logs?start=29-04-2018T00:00:00Z&end =29-04-2018T00:59:59Z
  3. 2回目のループ以下のようになります
  4. https://abcd.com/logs?start=29-04-2018T01:00:00Z&end =29-04-2018T01:59:59Z
  5. 以下のような最後のループ
  6. https://abcd.com/logs?start=29-04-2018T23:00:00Z&end =29-04-2018T23:59:59Z

このスクリプトはcronスケジュールに追加するので、毎日トリガーされ、昨日24時間ログが完了してダウンロードされます。

キーポイントは

  1. いつも昨日の日付
  2. フォーマットGMT
  3. 24回ループ

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

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

これを試して。

#!/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:00から23: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
1
roaima

期待どおりの出力が得られます。

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

あなたの助けをどうもありがとう

0
Jhony