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、最初の 2 つの星 ( *) と次の 3 つの数字を一致させ、それらの後にスペースを置きます。単純:

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のコメントと回答に関して、そこにある星が文字列の一部なのか、それともマークダウンの一部であるはずの場所なのか、私にはわかりません。いずれにせよ、a (ドットと 3 桁の数字) が一致
する唯一の場所は ms 部分です。.XXXこれもうまくいくでしょう:

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

正規表現を使用する
(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 に答える
0

あなたが言及したツールのいずれかで、後方参照を伴う正規表現置換を使用します。

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

と:'\1 \2'

( '$1 $2'Perlで使用)

于 2012-07-03T10:16:58.053 に答える