Awk
將通用文本文件中的所有 Unix 時間戳(以毫秒為單位)轉換為人類可讀的日期
我想在通用文本文件中將 Unix 紀元(以毫秒為單位)更改為正常日期。我接受 bash、sed、awk 或 perl 解決方案。
範例文件 1(只有 13 位數字是日期):
Foo bar 1397497040418 foo 1526 bar foobar, bar 1397497060518. Bar, 1357407040418 foo 10 foobar.
我想要這個輸出:
Foo bar 2014-04-14 19:37:20 foo 1526 bar foobar, bar 2014-04-14 19:37:40. Bar, 2013-01-05 18:30:40 foo 10 foobar.
我嘗試不成功:
sed -E "s/([0-9]{10})/date -d @\1/;e" file1
任何想法?
謝謝你。
使用您的輸入文件:
perl -MTime::Piece -pe ' s{ \b (\d{10}) \d{3}\b } { localtime($1)->strftime("%F %T") }xge ' file1
Foo bar 2014-04-14 13:37:20 foo 1526 bar foobar, bar 2014-04-14 13:37:40. Bar, 2013-01-05 12:30:40 foo 10 foobar.
假設您希望我們忽略多餘的數字並將日期轉換限制為僅 1st 10,這意味著該日期不是未來數十萬年,您可以使用 GNU
date
和perl
:$ perl -pe 's/\b(\d{10})\d{3}\b/chomp($i=`date -d \@$1 "+%F %T"`);$i/eg' file1 Foo bar 2014-04-14 18:37:20 foo 1526 bar foobar, bar 2014-04-14 18:37:40. Bar, 2013-01-05 17:30:40 foo 10 foobar.
然而, Glenn 的解決方案更簡潔、更便攜,所以如果您不介意使用 perl 模組(而且您不應該),我會推薦他而不是我的。
至於您的
sed
嘗試,為了使用命令的結果,您需要使用反引號或$(command)
. 所以你幾乎在那裡:$ sed -E "s/([0-9]{10})/$(date -d @\1)/" file1 Foo bar Thu 01 Jan 1970 01:00:01 AM BST418 foo 1526 bar foobar, bar 1397497060518. Bar, Thu 01 Jan 1970 01:00:01 AM BST418 foo 10 foobar.
當然,這不會刪除多餘的數字,也不會將其限制為僅 13 位數字,但由於您尚未闡明您需要什麼,我不知道如何解決它。我的 Perl 解決方案處理它,因此如果您不想刪除它們,可以使用 sed。