Awk

將通用文本文件中的所有 Unix 時間戳(以毫秒為單位)轉換為人類可讀的日期

  • July 7, 2020

我想在通用文本文件中將 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,這意味著該日期不是未來數十萬年,您可以使用 GNUdateperl

$ 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。

引用自:https://unix.stackexchange.com/questions/597169