2012-07-03 94 views
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。

+0

是字面上的星號在數據中還是隻用它們來突出顯示感興趣的部分? –

回答

2

假設星號只是爲了目的突出顯示問題的s以及它們實際上並不出現在數據:

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}' 
+0

也非常好 - 我覺得這非常可讀 – polomo12

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/' 
0

在您提到的任何工具中使用帶反向引用的正則表達式替換。

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

有:'\1 \2'

(Perl中使用'$1 $2'

+0

我應該補充說,你需要在'sed'中使用'-E'選項(對於擴展的正則表達式,awk,Perl和Python都可以使用) – cdarke

+0

你的意思是'-r'選項?沒有'-E'選項是'sed'。 – rush

+0

@cdarke,Rush是正確的,'sed'有'-r','grep'雖然有'-E' :)這個擴展正則表達式不需要''1''' \ 2'反向引用,只需使用'&',看看我的回答 – c00kiemon5ter

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) 
0

這將替換文件中,並使用擴展名.bak

創建備份
perl -i.bak -pe 's/(\*\*\d{3})(\d{3}\*\*)/$1 $2/' filename 
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 
+0

在我看來,這似乎是最簡潔優雅的方式來完成這個問題! – polomo12