我有一个包含多行的文件。有些行表示日期和时间,但该时间采用纪元格式。我尝试过使用一些命令,但该命令转换了所有数字。我只想转换适用的内容。相同的文件如下:-
猫格式化 =================================================== =========== 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”。
(通过)