我正在尝试通过外部 API 下载昨天的日志,对于 API,我需要提供从 & 到 的日期范围作为输入参数。
从 API 我可以为每次调用下载最多 1 小时的日志。
所以如果我想下载昨天的完整日志。我需要以昨天的日期(每小时一次)调用 API 24 次。
注意 API 仅支持 GMT 时间。所以需要提供GMT时间。
例如:-https://abcd.com/logs?start=从日期&结束=迄今为止
- 第一次循环它应该像下面这样,
- https://abcd.com/logs?start=29-04-2018T00:00:00Z&结束=29-04-2018T00:59:59Z
- 第二次循环它应该像下面这样
- https://abcd.com/logs?start=29-04-2018T01:00:00Z&结束=29-04-2018T01:59:59Z
- 最后一次循环像下面这样,
- https://abcd.com/logs?start=29-04-2018T23:00:00Z&结束=29-04-2018T23:59:59Z
我将把这个脚本添加到 cron 计划中,这样每天它就会被触发并下载昨天的 24 小时日志完成。
关键点是
- 总是昨天的日期
- 格式 GMT
- 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
非常感谢你的帮助