首页 > 解决方案 > 使用 awk 查看日志文件输出时将时间戳转换为 UTC 偏移量

问题描述

我有一个格式为时间戳的文件:
2020-06-10 04:51:34.572 INFO: [17] Log message

我希望能够以UTC+{n}查看输出

如果尝试:

awk  '{
  #for(timefield = 2;timefield<=NF;timefield++)
  timefield = 2

        #cmd = "date --date=\x27"TZ=UTC+7\" \"" $timefield "\"x27"
        #cmd = "date --date=\"TZ=UTC+7\" "" $timefield"
        cmd = "date --date=\"TZ=Europe/London\" "" $timefield"

#  if($timefield ~ /[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}/) {
        while(cmd | getline line) {
      sub($timefield,line,$0)
    }
   print
}'

但我越来越awk: line 12: runaway regular expression /} ...

更新:
制定正确的报价有很多困难。

获取时区转换的正确 GNU 日期语法是:

~# date --date='TZ="Asia/Bangkok" 2020-06-10 03:19:16.222'
Tue Jun  9 20:19:16 UTC 2020

请注意节中的单引号 ("'") --date='。如何在awk cmd命令中正确引用它?

标签: awktimezoneutclogfile

解决方案


考虑到需要awk在 shell 中引用脚本,实现正确的引用很烦人。从 OP 评论来看,将日志文件中的 GMT 时间转换为香港时间 (UTC+7) 的目标。

遵循 OP 结构,可以执行以下操作。

#! /bin/sh

awk '
{
    t_in = $1 " " $2
    cmd = "TZ=UTC+7 date -d \"" t_in "Z\""
    cmd | getline t_out
    $1 = t_out
    $2 = ""
    print
}
'

值得一提的是,此解决方案将在每一行上调用日期实用程序。对于大文件(超过 10,000 行),这可能会很昂贵。如果是这种情况,可以使用使用内置 awk 方法的替代解决方案。


推荐阅读