如何用Perl/BSD awk将数据流中UNIX时间戳转为ISO8601格式
解决方案
推荐方案(Perl 单行脚本,无外部调用,效率更高)
直接使用Perl内置的POSIX::strftime处理时间转换,无需调用外部命令,处理大流量输出也不会卡顿:
env TZ=GMT-3 perl -MPOSIX=strftime -pe 's/"(\d{10})"/sprintf("\"%s\"", strftime("%Y-%m-%dT%H%M%S%z", localtime($1)))/ge'
BSD Awk 方案
如果你更习惯用awk,也可以用BSD awk搭配系统自带的date命令实现:
env TZ=GMT-3 awk '{ while(match($0, /"([0-9]{10})"/, m)) { cmd = "date -r " m[1] " +%Y-%m-%dT%H%M%S%z" cmd | getline dt close(cmd) sub(/"[0-9]{10}"/, "\"" dt "\"") } print }'
使用方法
直接把脚本接在你原来的curl命令后面管道运行即可:
curl --write-out '\n%{http_code}\t=%{time_total}s\n' 你的API地址 | 上面选择的脚本命令
说明
- 匹配规则严格识别被双引号包裹的10位纯数字,不会误改其他字段内容
- 时区固定为GMT-3,输出格式完全符合示例要求
- 两种方案都完全依赖系统默认预装组件,无需安装任何第三方依赖
内容的提问来源于stack exchange,提问作者cnst
相关产品推荐
相关产品推荐

