将AWS CLI输出重定向至awk以实现操作日志时间戳记录
给AWS S3下载输出添加时间戳日志的解决方案
没问题,我来帮你搞定这个给S3下载命令加时间戳日志的需求!
首先要注意一个关键点:AWS CLI的download:这类进度提示信息是输出到**标准错误(stderr)**的,而不是标准输出(stdout),所以我们需要先把stderr重定向到stdout,这样awk才能捕获到这些内容。
基础实现命令
直接把处理后的日志追加到文件:
aws s3 sync s3://mbd-wombats/ aws/ 2>&1 | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}' >> s3_download.log
如果用aws s3 cp批量下载,命令类似:
aws s3 cp s3://mbd-wombats/ aws/ --recursive 2>&1 | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}' >> s3_download.log
同时在终端查看输出+写入日志
如果你想一边在终端看到实时输出,一边把带时间戳的内容写入日志,可以用tee命令:
aws s3 sync s3://mbd-wombats/ aws/ 2>&1 | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}' | tee -a s3_download.log
这里的-a参数表示追加写入,不加的话会覆盖原有日志文件。
命令细节解释
2>&1:把stderr的内容重定向到stdout,确保awk能捕获到所有下载提示行。awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}':用awk的strftime函数生成格式化的时间戳,然后把时间戳和原行内容拼接输出。你可以修改时间戳格式,比如用%Y-%m-%dT%H:%M:%S生成ISO标准格式的时间。>> s3_download.log:将处理后的内容追加到日志文件,若要覆盖文件请用>。
处理后的日志示例
最终日志文件里的内容会是这样的:
2024-05-20 14:35:22 download: s3://mbd-wombats/IMG_0210.jpg to aws/IMG_0210.jpg 5 file(s) remaining 2024-05-20 14:35:23 download: s3://mbd-wombats/IMG_0209.jpg to aws/IMG_0209.jpg 4 file(s) remaining 2024-05-20 14:35:24 download: s3://mbd-wombats/IMG_0207.jpg to aws/IMG_0207.jpg 3 file(s) remaining
内容的提问来源于stack exchange,提问作者Martyn




