我有一个包含一系列时间戳的日志文件。我需要以某种方式修改它。
日志文件:
['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 :(得分:2)
由于需要转义引号,sed表达式不是很易读,所以可能使用双引号:
sed 's/\['\''\(.*\)'\'', '\''\(.*\):\(.*\)'\''\]/\1T\2.\3Z/'
sed "s/\['\(.*\)', '\(.*\):\(.*\)'\]/\1T\2.\3Z/"
如果你的sed支持它,那么甚至可能-r
:
sed -r "s/\['(.*)', '(.*):(.*)'\]/\1T\2.\3Z/"
答案 1 :(得分:2)
提取子字符串,并创建新的时间戳:
perl -pe 'substr($_,0,30) = sprintf "%sT%s.%sZ", substr($_,2,10), substr($_,16,8), substr($_,25,3)' file
答案 2 :(得分: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
答案 3 :(得分: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)}'
答案 4 :(得分:2)
统称使用unix工具集可能比单个工具集更好。
tr -d "'[]," <log | tr ' ' 'T' | sed -r 's/:([0-9]{3})$/.\1Z/'
答案 5 :(得分:1)
sed 's@[^0-9]*\([0-9\-]*\)[^0-9]*\([0-9:]*\).*@\1T\2Z@;s/:/./3' file