2015-11-04 95 views
0

我有一个包含一系列时间戳的日志文件。我需要以某种方式修改它。使用awk/sed修改datetime

日志文件:

['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。

+0

检查'男人date',使用'日期-d “...... ”'然后'+“ %......”'你可以做魔术 – fedorqui

+0

@fedorqui - 的'-d'选项是Linux特有的。在BSD/OSX的'date'命令中提及'-f'选项也很重要。 – ghoti

+0

Araz,您是否有兴趣根据特定时区转换时间,或者只是将输入按照文本进行按摩? – ghoti

回答

2

战略经济对话表达不是很可读,因为需要逃跑的报价,那么也许使用双引号:

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

或者也许,如果你的sed甚至-r支持它:

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

@glennjackman:更新,谢谢。 – choroba

2

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

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

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

2

如果您只是处理文本,以下可能已足够。

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

共同使用UNIX工具集可能比一个更好的单身。

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