使用awk/sed修改日期时间

使用awk/sed修改日期时间,awk,sed,Awk,Sed,我有一个包含一系列时间戳的日志文件。我需要以某种方式修改它 日志文件: ['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: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

我怎样才能做到这一点


Thakns.

由于需要转义引号,sed表达式的可读性不强,因此可能需要使用双引号:

sed 's/\['\''\(.*\)'\'', '\''\(.*\):\(.*\)'\''\]/\1T\2.\3Z/'
sed "s/\['\(.*\)', '\(.*\):\(.*\)'\]/\1T\2.\3Z/"
或者,如果您的sed支持,甚至可能
-r

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

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

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

输出

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

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

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)}'

集体使用unix工具集可能比单独使用要好

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

tr-d”[],“检查
man date
,使用
date-d”…
然后
+“%…”
您可以执行magic@fedorqui-d
选项是特定于Linux的。同样重要的是要提到BSD/OSX的
date
命令中的
-f
选项。Araz,您是否有兴趣根据特定时区转换时间,或者只是将输入作为文本进行处理?@ghoti no特定时区。就像绳子一样。
tr -d "'[]," <log | tr ' ' 'T' | sed -r 's/:([0-9]{3})$/.\1Z/'
sed 's@[^0-9]*\([0-9\-]*\)[^0-9]*\([0-9:]*\).*@\1T\2Z@;s/:/./3' file