1

我有一个包含如下行的日志文件:

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。

4

6 回答 6

2

使用 just 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匹配 a(点和三位数字)的地方是 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
于 2012-07-03T10:21:32.667 回答
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}'
于 2012-07-03T11:03:10.807 回答
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/'
于 2012-07-03T10:16:52.430 回答
0

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

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

和:'\1 \2'

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

于 2012-07-03T10:16:58.053 回答
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)
于 2012-07-03T10:17:26.910 回答
0

这将在文件中替换,并创建扩展名为 .bak 的备份

perl -i.bak -pe 's/(\*\*\d{3})(\d{3}\*\*)/$1 $2/' filename
于 2012-07-03T10:17:29.263 回答