如何将列中的时间戳转换为日期?

Ala*_*Ali 19 awk perl text-processing

我有一个包含此文件的文件:

1415602803,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
1415602807,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
1415602811,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
1415602815,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22
Run Code Online (Sandbox Code Playgroud)

我想将时间戳转换为这种格式的日期:

2014-11-10 02:00:03,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
2014-11-10 02:00:07,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
2014-11-10 02:00:11,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
2014-11-10 02:00:15,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我知道这有效:(perl -pe 's/(\d+)/localtime($1)/e'来自这个问题)但输出格式是Mon Nov 10 02:00:03 2014.

我知道这个命令可以时间戳转换成我想要的输出:date -d@1415602803 +"%F %H:%M:%S",但我不能使它与工作awk使用system("cmd"),因为所有的报价和诸如此类的东西。

Ala*_*Ali 20

在这里找到了一些东西:Stackoverflow - Convert from unixtime at command line

想出了这个:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
Run Code Online (Sandbox Code Playgroud)
  • -F","使用字段分隔符,,
  • OFS=",";以便输出字段也由 a 分隔,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);将第一个字段的值更改$1为指定的格式,以及
  • print $0; 打印整行。

  • `awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'` 给出了 `awk: line 2: function strftime never defined` 在这里。请澄清并不是每个 AWK 都有 `strftime()`!对于在大多数(所有?)AWK 中运行的解决方案,请使用外部 `date` 命令以保持可移植性。 (2认同)
  • @yeti,有一些`date` 实现可以作为扩展在格式之间转换日期,但它的完成方式在实现之间完全不同。例如,Costas 给出的解决方案使用了特定于 GNU `date` 的语法。如果你想要可移植性,请使用 `perl`。 (2认同)

Mar*_*rki 9

可能像这样

perl -pe 'use POSIX qw(strftime); s/^(\d+)/strftime "%F %H:%M:%S", localtime($1)/e' 
Run Code Online (Sandbox Code Playgroud)


Cos*_*tas 6

如果您愿意awk,可以使用date任何日期格式的外部命令

awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'
Run Code Online (Sandbox Code Playgroud)

  • 请注意,使用外部命令会导致严重的性能下降,尤其是在处理数千行时尤为明显 (5认同)