将纪元时间转换为人类可读格式的脚本

将纪元时间转换为人类可读格式的脚本

我有一个包含多行的文件。有些行表示日期和时间,但该时间采用纪元格式。我尝试过使用一些命令,但该命令转换了所有数字。我只想转换适用的内容。相同的文件如下:-

猫格式化
=================================================== ===========
0='917598936722' 395='1529313008' 391='0' 165='0' 142='0' 131='状态待定'
=================================================== ===========

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':日期_TC1  
第396章 1529313008

我需要转换 rowsDate_TC1和中存在的纪元时间TC2。与此类似,还有更多行,但我不知道哪一行代表纪元日期/时间;但是,如果该日期/时间以纪元格式存在,我需要转换为人类可读的格式。

答案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

使用GNUsed, 尝试这个:

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:对整行执行 ( e) 和( )echo.*

eval注意:这与执行原始文件中的所有内容类似,例如“do_something_evil”。

通过

相关内容