3

ログファイルがあり、その各行は次のようになっています。

timestamp=1356431101, entity=xxx, event: xxxxxx

ここで、sedを使用して、タイムスタンプを人間が読める形式の日時に置き換えたいと思います。

timestamp=2012-12-24 10:00:00, entity=xxx, event:xxxxx

私のコマンドは:

sed "s/^timestamp=\([0-9]\{10\}\),/timestamp=\`date +%D --date=@\1\`,/"

ただし、問題は、を\110桁のタイムスタンプで置き換えることができず、代わりに常に数字として扱われることです1。誰かがこの問題に取り組む方法を教えてもらえますか?前もって感謝します!

4

4 に答える 4

3

awk は、許容できる場合、これらのものに適しています。

awk -F, '{x=$1;sub(/.*=/,"",$1);sub(/=.*/,strftime("=%Y-%m-%d %H:%M:%S",$1),x);$1=x;}1' OFS=, file

サンプル結果:

$ cat file
timestamp=1356431101, entity=xxx, event: xxxxxx
timestamp=1354770380, entity=xxx, event: xxxxxx

コマンドの実行時:

$ awk -F, '{x=$1;sub(/.*=/,"",$1);sub(/=.*/,strftime("=%Y-%m-%d %H:%M:%S",$1),x);$1=x;}1' OFS=, file
timestamp=2012-12-25 15:55:01, entity=xxx, event: xxxxxx
timestamp=2012-12-06 10:36:20, entity=xxx, event: xxxxxx

最初のsubコマンドは、タイムスタンプを抽出します。を使用する 2 番目strftimeは、タイムスタンプを日付と時刻に置き換えます。1すべての行を印刷するために使用されます。

于 2012-12-26T05:07:45.980 に答える
1

タイムスタンプの操作は、Perl や Ruby などの最新のプログラミング言語で行うのが最適です。ただし、GNU awk がある場合は、次のstrftime()関数を使用してこれを行うことができます。

awk '{ sub(/[0-9]{10}/, strftime("%Y-%m-%d %H:%M:%S", substr($0,11,10))) }1' file

結果:

timestamp=2012-12-25 20:25:01, entity=xxx, event: xxxxxx

GNU awk の時間関数の詳細については、こちらを参照してください。

http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html

于 2012-12-26T07:04:44.500 に答える
1

私は実際にはこのawkアプローチを好みますが、完全を期すためにperl解決策は次のようになります。

perl -Mposix -pe 's/([0-9]{10})/POSIX::strftime( "%Y-%m-%d %H:%M:%S", gmtime($1))/eg'

先頭の "timestamp=" を一致させて置換を制限したい場合 (サンプル入力では必要ないように見えますが)、次を使用できます。's/(?:timestamp=)([0-9]*)/...

于 2012-12-26T11:04:50.037 に答える