在一行中间拆分时间戳

时间:2012-07-03 10:11:38

标签: python perl bash sed awk

我有一个包含这样的行的日志文件:

06/28/12 14:17:10.**754117** :R: INFO  [6] X10.cpp:4042 |xevent 35932825 1 0 0

我希望时间戳能够分割出微秒 - 即我希望输出具有以下形式:

06/28/12 14:17:10.**754 117** :R: INFO  [6] X10.cpp:4042 |xevent 35932825 1 0 0

我将如何做到这一点?

我可以使用任何标准的UNIX工具(例如awk / sed)和python / perl。

6 个答案:

答案 0 :(得分:2)

仅使用sed,匹配前两颗星(*)和接下来的三个数字,然后在这些数字之后放置一个空格。简单:

sed 's;\*\*[0-9]\{3\};& ;'

试试吧

$ echo '06/28/12 14:17:10.**754117** :R: INFO  [6] X10.cpp:4042 |xevent 35932825 1 0 0' | sed 's;\*\*[0-9]\{3\};& ;'
06/28/12 14:17:10.**754 117** :R: INFO  [6] X10.cpp:4042 |xevent 35932825 1 0 0

关于@DennisWilliamson的评论和回答,我不确定自己的星是否有弦的一部分,或者应该是降价的一部分。
在任何情况下,唯一匹配.XXX(点和三位)的地方是ms部分。所以这也会起作用:

sed 's;[0-9]\{3\};& ;'

尝试一下:)

$ echo '06/28/12 14:17:10.754117 :R: INFO  [6] X10.cpp:4042 |xevent 35932825 1 0 0' | sed 's;[0-9]\{3\};& ;'
06/28/12 14:17:10.754 117 :R: INFO  [6] X10.cpp:4042 |xevent 35932825 1 0 0

添加点会使它更安全一点:

sed 's;\.[0-9]\{3\};& ;'

尝试一下:)

$ echo '06/28/12 14:17:10.754117 :R: INFO  [6] X10.cpp:4042 |xevent 35932825 1 0 0' | sed 's;\.[0-9]\{3\};& ;'
06/28/12 14:17:10.754 117 :R: INFO  [6] X10.cpp:4042 |xevent 35932825 1 0 0

答案 1 :(得分:2)

假设星号只是为问题的目的而突出显示,并且它们实际上并未出现在数据中:

echo '06/28/12 14:17:10.754117 :R: INFO  [6] X10.cpp:4042 |xevent 35932825 1 0 0' | 
awk '{$2 = substr($2, 1, length($2) - 3) " " substr($2, length($2) - 2); print}'

结果:

06/28/12 14:17:10.754 117 :R: INFO [6] X10.cpp:4042 |xevent 35932825 1 0 0

您还可以对长度进行硬编码:

awk '{$2 = substr($2, 1, 12) " " substr($2, 13); print}'

答案 2 :(得分:1)

echo '06/28/12 14:17:10.**754117** :R: INFO  [6] X10.cpp:4042 |xevent 35932825 1 0 0' | \
sed 's/\(\*\*[0-9]\{3\}\)\([0-9]\{3\}\*\*\)/\1 \2/'

答案 3 :(得分:0)

在您提到的任何工具中使用带有反向引用的正则表达式替换。

替换:'\*\*(\d{3})(\d{3})\*\*'

with:'\1 \2'

(在Perl中使用'$1 $2'

答案 4 :(得分:0)

使用正则表达式 (在python中)

import re

text = '06/28/12 14:17:10.**754117** :R: INFO  [6] X10.cpp:4042 |xevent 35932825 1 0 0'

def repl(m):
    return '**%s %s**' % (m.group(1)[:3], m.group(1)[3:])

re.sub('\*\*(\d{6})\*\*', repl, text)

答案 5 :(得分:0)

这将替换文件,并使用扩展名.bak

创建备份
perl -i.bak -pe 's/(\*\*\d{3})(\d{3}\*\*)/$1 $2/' filename