Bash의 날짜 및 시간 루프

Bash의 날짜 및 시간 루프

외부 API를 통해 어제의 로그를 다운로드하려고 합니다. API의 경우 &부터 날짜 범위를 입력 매개변수로 제공해야 합니다.

API에서 호출당 최대 1시간의 로그를 다운로드할 수 있습니다.

그래서 어제의 전체 로그를 다운로드하고 싶다면. 어제 날짜를 기준으로 API를 24번(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. 두 번째 루프아래와 같아야합니다
  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

가끔씩 발생하는 윤초를 처리할 수 없습니다. 이 작업을 수행해야 하는 경우 하루의 마지막 범위가 에서 로 이동해야 할 수 있는 더 복잡한 코드를 사용하세요 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

답변2

예상되는 결과를 얻습니다.

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

당신의 도움을 주셔서 대단히 감사합니다

관련 정보