如何将日志中的UTC+1时间转换为UTC时间(sed尝试失败求助)
如何将日志中的UTC+1时间转换为UTC时间(sed尝试失败求助)
看起来你踩了sed和shell命令替换的一个常见坑——shell会先执行$(...)里的内容,再把结果传给sed,这时候sed的捕获组\1还根本没生效呢!
你写的命令里,$(date -d "\1 UTC+1" ...)会被shell先解析,这时候\1就是个普通字符串,不是sed捕获到的时间内容,date命令自然识别不了,所以才会报“invalid date”的错。
给你两个实用的解决方案,比硬扛sed靠谱多了:
方案一:用awk处理(推荐,更简洁高效)
awk天生适合逐行处理文本,还能方便地调用外部命令处理捕获到的内容。针对你的测试用例,执行这个命令就能得到预期结果:
echo '19:40:14 foo bar' | awk 'match($0, /([0-9]{2}:[0-9]{2}:[0-9]{2})/, m) { # 构造date命令,把捕获到的UTC+1时间转成UTC cmd = "date -d \"" m[1] " UTC+1\" -u +%H:%M:%S" # 执行命令并获取结果 cmd | getline utc_time close(cmd) # 替换原时间为UTC时间 sub(/[0-9]{2}:[0-9]{2}:[0-9]{2}/, utc_time) } 1' # 1表示打印处理后的整行
运行后就能把19:40:14转换成18:40:14,完全符合你的预期。
如果要处理带日期的完整日志格式(比如[2024-01-20 15:23:00] hello world),只需要调整awk的匹配规则:
awk 'match($0, /\[([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2})\]/, m) { cmd = "date -d \"" m[1] " UTC+1\" -u +\"%Y-%m-%d %H:%M:%S\"" cmd | getline utc_time close(cmd) sub(/\[([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2})\]/, "[" utc_time "]") } 1' your_log_file
方案二:如果非要用sed(不推荐,效率低且绕)
要是你坚持想用sed,得用shell循环逐行处理,让sed先捕获时间,再传给date命令:
while read -r line; do # 先从行里提取时间,再传给date转成UTC,最后用sed替换 echo "$line" | sed -E "s/([0-9:]+)/$(echo "$line" | sed -E 's/.*([0-9:]+).*/\1/' | xargs -I {} date -d "{} UTC+1" -u +%R)/g" done < your_log_file
这个方法需要多次调用sed和date,大日志文件的话效率会很低,所以还是更推荐awk方案。
备注:内容来源于stack exchange,提问作者sloppy
相关产品推荐
相关产品推荐

