我有一个包含这样的行的日志文件:
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。
答案 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