ログファイルの時間を、エポックミリ秒から人が読める日付に変換/交換します。

ログファイルの時間を、エポックミリ秒から人が読める日付に変換/交換します。

次の構造のログファイルがあります。

例:

1522693524403 entity1,sometext
1522693541466 entity2,sometext
1522693547273 entity1,sometext
...

Debianシステムでbashコマンドを使用して、すべてのログファイルの時間をepochミリ秒からDD.MM.YYYY HH:MM:SSに変更したいと思います。

ここと他のサイトで提供されているさまざまなソリューションを試しましたが、実際には効果がありませんでした。

誰でも私を助けることができますか?

乾杯

クイックスタート

答え1

シェルスクリプトを使用して1行ずつ読み込むか、スクリプトがawksystemを呼び出すと、date非常に遅くなり、プロセスが多すぎます。単純なawk、Perl、Python、または他のスクリプトを使用する必要があります。すべての言語には、フォーマット間変換用の標準日付/時刻関数があります。

ここそしてここ良い参考資料です。 GNUを使用したい場合awk 時間関数そして、strftime()あなたの場合に必要なのは、エポック部分文字列(ミリ秒を除く)を選択することだけです。

$ awk '{$1 = strftime("%F %T", substr($1,1,10))} 1' file
2018-04-02 21:25:24 entity1,sometext
2018-04-02 21:25:41 entity2,sometext
2018-04-02 21:25:47 entity1,sometext

またはミリ秒を一緒に印刷します。

$ awk '{$1 = strftime("%F %T", substr($1,1,10)) "." substr($1,11)} 1' file
2018-04-02 21:25:24.403 entity1,sometext
2018-04-02 21:25:41.466 entity2,sometext
2018-04-02 21:25:47.273 entity1,sometext

または日 - 月 - 年の形式を印刷します。

$ awk '{$1 = strftime("%d-%m-%Y %T", substr($1,1,10))} 1' file
02-04-2018 21:25:24 entity1,sometext
02-04-2018 21:25:41 entity2,sometext
02-04-2018 21:25:47 entity1,sometext

答え2

これはbashコマンドで実行できる操作ではありません。 bashは浮動小数点演算を実行できず、日付を処理できないため、外部プログラムが必要です。私はあなたが「コマンドラインから」を意味し、実際に純粋なbashソリューションは必要ないと思います。この仮定によると、gawk(GNU awk)ソリューションは次のようになります。

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:24 entity1,sometext
02.04.2018 19:04:41 entity2,sometext
02.04.2018 19:04:47 entity1,sometext

このstrftime関数はタイムスタンプを日付に変換します。単位がミリ秒なので、sprintf秒に変換します。最後は、1;(最初​​のフィールド)に新しい値を割り当てた後にgawk行を印刷するように指示します。$1


出力は時間帯によって異なります。たとえば、上記のコードは GMT タイムゾーンに設定されたコンピュータで実行されます。だから私の電話番号はの電話番号とは異なります。@thanasispからの返信これはおそらく別のタイムゾーンで実行されているようです。TZコマンドを実行するときに変数を設定してそれを制御し、出力を変更できます。たとえば、次を比較します。

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:02.24 entity1,sometext
02.04.2018 19:04:02.41 entity2,sometext
02.04.2018 19:04:02.47 entity1,sometext

これに関して:

$ TZ=America/Los_Angeles gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 11:04:02.24 entity1,sometext
02.04.2018 11:04:02.41 entity2,sometext
02.04.2018 11:04:02.47 entity1,sometext

またはこれ:

$ TZ=Asia/Tokyo gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
03.04.2018 03:04:03.24 entity1,sometext
03.04.2018 03:04:03.41 entity2,sometext
03.04.2018 03:04:03.47 entity1,sometext

関連情報