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


15

我有一个包含此文件:

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

我想将时间戳转换为以下格式的日期:

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

我怎样才能做到这一点?

我知道这可行:(perl -pe 's/(\d+)/localtime($1)/e'这个问题开始),但是输出格式是Mon Nov 10 02:00:03 2014

我知道此命令可以将时间戳转换为所需的输出:date -d@1415602803 +"%F %H:%M:%S",但是由于所有引号和其他原因,我无法使其与一起awk使用system("cmd")

Answers:


6

这样也许

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

17

在这里找到了一些东西:Stackoverflow-在命令行从unixtime转换

想到了这个:

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

2
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
斯特凡Chazelas

4

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

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

+1表示不使用strftime()

4
请注意,使用外部命令将导致严重的性能下降,尤其是如果正在处理数千行时,则尤其明显
JoseGómez15

2

您也可以尝试:

cat test.txt | sed 's/^/echo "/; s/\([0-9]\{10\}\)/`date -d @\1`/; s/$/"/' | bash

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.