如何使用sed或awk将文本文件UTC时间戳转换为UTC-5时区时间
解决方案
你可以使用GNU awk(Ubuntu默认预装)实现该需求,相比手动计算时间偏移,调用系统date工具做时区转换可以自动处理跨天、跨月、闰年等边界场景,避免逻辑错误。
执行命令
将以下命令中的input.log替换为你的原始文件路径,执行后结果会输出到output.log:
gawk ' { # 匹配YYYY/MM/DD HH:MM:SS格式的时间字符串 if (match($0, /([0-9]{4})\/([0-9]{2})\/([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})/, t)) { # 将UTC时间转换为时间戳 cmd = "date -d \"" t[1] " " t[2] " " t[3] " " t[4] ":" t[5] ":" t[6] " UTC\" +%s" cmd | getline ts close(cmd) # 将时间戳转换为UTC-5时区的目标格式 tz_cmd = "TZ=Etc/GMT+5 date -d @" ts " +\"%Y/%m/%d %H:%M:%S\"" tz_cmd | getline new_ts close(tz_cmd) # 替换原时间字符串 sub(/[0-9]{4}\/[0-9]{2}\/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/, new_ts) } print }' input.log > output.log
说明
- 时区设置使用
TZ=Etc/GMT+5对应UTC-5,是因为POSIX时区命名规则中,Etc/GMT后缀的偏移符号与常规UTC偏移相反,GMT+5即代表比UTC晚5小时。 - 如果你的系统默认awk为GNU版本,可直接将命令中的
gawk替换为awk使用。 - 该命令处理你提供的示例输入,输出结果和你给出的目标格式完全一致。
内容的提问来源于stack exchange,提问作者Rolando Diaz
相关产品推荐
相关产品推荐

