【问题标题】:Modify datetime using awk/sed使用 awk/sed 修改日期时间
【发布时间】:2015-11-05 13:28:50
【问题描述】:

我有一个包含一系列时间戳的日志文件。我需要以某种方式对其进行修改。

日志文件:

['2015-11-04', '13:47:37:167']
['2015-11-04', '13:47:47:164']
['2015-11-04', '13:47:57:164']
['2015-11-04', '13:48:07:164']
['2015-11-04', '13:48:17:164']
['2015-11-04', '13:48:27:166']
['2015-11-04', '13:48:37:164']
['2015-11-04', '13:48:47:164']
['2015-11-04', '13:48:57:167']
['2015-11-04', '13:49:07:164']
['2015-11-04', '13:49:17:166']
['2015-11-04', '13:49:27:164']
['2015-11-04', '13:49:37:164']
['2015-11-04', '13:49:47:165']
['2015-11-04', '13:49:57:164']

这是我期望在每一行 2015-11-04T13:49:57.164Z 中的示例输出

我怎样才能做到这一点?

谢谢。

【问题讨论】:

  • 检查man date,使用date -d"...",然后+"%..."你可以做魔术
  • @fedorqui - -d 选项是特定于 Linux 的。同样重要的是要提到 BSD/OSX 的 date 命令中的 -f 选项。
  • Araz,您是否有兴趣根据特定时区转换时间,或者只是将输入作为文本进行按摩?
  • @ghoti 没有特定时区。就像字符串一样。

标签: awk sed


【解决方案1】:

sed 表达式因为需要对引号进行转义,可读性不强,所以可能使用双引号:

sed 's/\['\''\(.*\)'\'', '\''\(.*\):\(.*\)'\''\]/\1T\2.\3Z/'
sed "s/\['\(.*\)', '\(.*\):\(.*\)'\]/\1T\2.\3Z/"

如果您的 sed 支持,甚至可能是 -r:

sed -r "s/\['(.*)', '(.*):(.*)'\]/\1T\2.\3Z/"

【讨论】:

    【解决方案2】:

    提取子字符串,并创建新的时间戳:

    perl -pe 'substr($_,0,30) = sprintf "%sT%s.%sZ", substr($_,2,10), substr($_,16,8), substr($_,25,3)' file
    

    【讨论】:

      【解决方案3】:

      或者

       awk '{
        gsub(/[\\]\\[\\['"'"']/, "", $0)
        sub(/,/, "\\t", $0) 
        sub(/:/,"x",$2); sub(/:/,"x",$2); sub(/:/,".",$2)
        gsub(/x/,":",$2)
        print $1 "T" $2 "Z"}' logFile
      

      输出

      2015-11-04T13:47:37.167Z
      2015-11-04T13:47:47.164Z
      2015-11-04T13:47:57.164Z
      2015-11-04T13:48:07.164Z
      2015-11-04T13:48:17.164Z
      2015-11-04T13:48:27.166Z
      2015-11-04T13:48:37.164Z
      2015-11-04T13:48:47.164Z
      2015-11-04T13:48:57.167Z
      2015-11-04T13:49:07.164Z
      2015-11-04T13:49:17.166Z
      2015-11-04T13:49:27.164Z
      2015-11-04T13:49:37.164Z
      2015-11-04T13:49:47.165Z
      2015-11-04T13:49:57.164Z
      

      有点笨拙,但对于某些人来说,可能更容易理解正在发生的事情。

      IHTH

      【讨论】:

        【解决方案4】:

        集体使用 unix 工具集可能比单独使用一个更好。

        tr -d "'[]," <log | tr ' ' 'T' | sed -r 's/:([0-9]{3})$/.\1Z/'
        

        【讨论】:

          【解决方案5】:

          如果您只是处理文本,以下内容可能就足够了。

          awk -F'[^0-9:-]+' '{print $2"T"$3"Z"}'
          

          当然,这不会将最后一个冒号转换为点。为此,您可能可以暴力破解它,相信您的时间格式不会改变:

          awk -F'[^0-9:-]+' '{printf("%sT%s.%sZ\n",$2,substr($3,1,8),substr($3,10))}'
          

          或者甚至:

          awk -F'[^0-9-]+' '{printf("%sT%s:%s:%s.%sZ\n",$2,$3,$4,$5,$6)}'
          

          【讨论】:

            【解决方案6】:
            sed 's@[^0-9]*\([0-9\-]*\)[^0-9]*\([0-9:]*\).*@\1T\2Z@;s/:/./3' file
            

            【讨论】:

              猜你喜欢
              • 2013-08-29
              • 1970-01-01
              • 2015-03-19
              • 2011-01-10
              • 1970-01-01
              • 1970-01-01
              • 2017-05-13
              • 1970-01-01
              相关资源
              最近更新 更多