web-dev-qa-db-ja.com

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

複数の行を含むファイルがあります。一部の行は日付と時刻を表しますが、その時刻はエポック形式です。いくつかのコマンドを使用してみましたが、そのコマンドはすべての数字を変換しました。該当するものだけを変換したい。同じファイルは以下の通りです:-

 cat FORMATTED 
 ====================================== ======================= 
 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 =' 1529313008 ': Date_TC1 
 396 == '1529313008':TC2 

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

1
Prince Garg
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 
1

GNU 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_:すべての_'_を_\'_に置き換えて、の間のすべてが最後のステップで解釈されるようにします。

  • _s/\$[^(]/\\$\(/g;_:_$_が後に続かないすべての_(_を_\$_に置き換えて、これらが最後のステップで変数として解釈されないようにします。

  • _s/.*/echo &/;e_:行全体で(eechoを実行します(_.*_)

注:これはevalと同様に動作し、元のファイルにあるすべてのものを実行します。 `do_something_evil`。

経由

0
pLumo