使用sed将时间戳转换为datetime

时间:2012-12-26 04:51:46

标签: unix sed

我有一个日志文件,其中的每一行都是:

timestamp=1356431101, entity=xxx, event: xxxxxx

现在我想用sed替换人类可读日期时间的时间戳:

timestamp=2012-12-24 10:00:00, entity=xxx, event:xxxxx

我的命令是:

sed "s/^timestamp=\([0-9]\{10\}\),/timestamp=\`date +%D --date=@\1\`,/"

但问题是\1不能用10位数时间戳代替,而是始终将其视为数字1。谁能告诉我如何解决这个问题?提前谢谢!

4 个答案:

答案 0 :(得分:3)

如果可以接受的话,awk对这些东西更好:

awk -F, '{x=$1;sub(/.*=/,"",$1);sub(/=.*/,strftime("=%Y-%m-%d %H:%M:%S",$1),x);$1=x;}1' OFS=, file

示例结果:

$ cat file
timestamp=1356431101, entity=xxx, event: xxxxxx
timestamp=1354770380, entity=xxx, event: xxxxxx

运行命令时:

$ awk -F, '{x=$1;sub(/.*=/,"",$1);sub(/=.*/,strftime("=%Y-%m-%d %H:%M:%S",$1),x);$1=x;}1' OFS=, file
timestamp=2012-12-25 15:55:01, entity=xxx, event: xxxxxx
timestamp=2012-12-06 10:36:20, entity=xxx, event: xxxxxx

第一个sub命令提取时间戳。使用strftime的第二个用时间戳替换日期和时间。 1用于打印每一行。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

时间戳操作最好使用更现代的编程语言,如Perl或Ruby。但是,如果您有GNU awk,则可以使用strftime()函数执行此操作:

awk '{ sub(/[0-9]{10}/, strftime("%Y-%m-%d %H:%M:%S", substr($0,11,10))) }1' file

结果:

timestamp=2012-12-25 20:25:01, entity=xxx, event: xxxxxx

您还可以在此处阅读有关GNU awk时间函数的更多信息:

http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html

答案 3 :(得分:1)

我实际上更喜欢awk方法,但为了完整性,perl解决方案如下:

perl -Mposix -pe 's/([0-9]{10})/POSIX::strftime( "%Y-%m-%d %H:%M:%S", gmtime($1))/eg'

如果您想匹配前导“timestamp =”以限制替换(虽然在给定示例输入时这似乎不是必需的),您可以使用:'s/(?:timestamp=)([0-9]*)/...