エポック時間を人間が読める形式に変換するスクリプト

エポック時間を人間が読める形式に変換するスクリプト

複数行を含むファイルがあります。一部の行は日付と時刻を表しますが、時間はエポック形式です。いくつかのコマンドを試しましたが、そのコマンドはすべての数値を変換します。その内容だけを変換したいです。同じファイルは次のとおりです。

猫の書式
================================================== ===========
0='917598936722' 395='1529313008' 391='0' 165='0' 142='0' 131='保留状態'
================================================== ===========

0='917598936722':MSISDN  
131='ステータス_保留':PROMO_TP3_STATUS  
142='0':USAGE_COUNT_3_STATUS  
165='0':EBUCKET_USAGE_TS_3  
391='0':PROM_3_END_TIMESTAMP  
395='1529313008':日付_TC1  
396話

Date_TC1の行とエポック時間を変換する必要がありますTC2。同様に、より多くの行がありますが、どちらがエポックの日付/時刻を表すのかわかりません。ただし、その日付/時刻がepoch形式で存在する場合は、人間が読める形式に変換する必要があります。

答え1

cat conv.awk

/Date_TC1/||/TC2/   {
    split($0, r, "'")
    print(r[1], strftime("%c", r[2]), r[3], r[4])
    next
    }

{ print }

awk -f conv.awk src.txt
=============================================================
0='917598936722' 395='1529313008' 391='0' 165='0' 142='0' 131='Status_Pending'
=============================================================

0='917598936722'    :MSISDN  
131='Status_Pending':PROMO_TP3_STATUS  
142='0'             :USAGE_COUNT_3_STATUS  
165='0'             :EBUCKET_USAGE_TS_3  
391='0'             :PROM_3_END_TIMESTAMP  
395= Mon 18 Jun 2018 11:10:08 AM CEST     :Date_TC1   
396== Mon 18 Jun 2018 11:10:08 AM CEST    :TC2 

答え2

使用牛に似た一種の栄養sed、この試み:

sed -re 's/([0-1][0-6][0-9]{8})/$(date -d @&)/g;
         /date -d/ s/\x27/\\\x27/g;
         /date -d/ s/\$[^(]/\\$\(/g;
         /date -d/ s/.*/echo &/e' FORMATTED

説明する:

  • s/([0-1][0-6][0-9]{8})/$(date -d @&)/g:すべてのタイムスタンプ(最初の数字が00 - 16の10桁)を次に置き換えます。$(date -d @<timestamp>)

  • /date -d/date -d:その行(=前の手順で変更した行)にある場合にのみ、次のコマンドを実行します。

  • s/\x27/\\\x27/g:その間にあるすべての項目があるようにallを'次に置き換えます。\'〜する最後のステップで説明してください。

  • s/\$[^(]/\\$\(/g;$:最後のステップで変数として解釈されないように、後に来ないすべての項目を置き換えます。(\$

  • s/.*/echo &/;e:行全体で(e)と()を実行します。echo.*

eval注:これは、「do_something_evil」など、元のファイルのすべてのエントリを実行するのと似ています。

渡す)

関連情報