여러 줄이 포함된 파일이 있습니다. 일부 행은 날짜와 시간을 나타내지만 시간은 에포크 형식입니다. 일부 명령을 사용해 보았지만 해당 명령은 모든 숫자를 변환합니다. 해당 내용만 변환하고 싶습니다. 동일한 파일은 다음과 같습니다.
고양이 서식 ================================================= = =========== 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 날짜/시간을 나타내는지 알 수 없습니다. 그러나 해당 날짜/시간이 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"과 같이 원본 파일의 모든 항목을 실행하는 것과 유사합니다.
(통과하다)