将时间从纪元毫秒转换/替换为日志文件中人类可读的日期

将时间从纪元毫秒转换/替换为日志文件中人类可读的日期

我有一个具有以下结构的日志文件

例子:

1522693524403 entity1,sometext
1522693541466 entity2,sometext
1522693547273 entity1,sometext
...

现在我想在 Debian 系统上使用 bash 命令将所有日志文件中的时间从纪元毫秒替换为 DD.MM.YYYY HH:MM:SS。

我尝试了这里和其他网站上提供的不同解决方案,但它对我来说并没有真正起作用。

有人可以帮我吗?

干杯

快速启动

答案1

如果使用shell脚本逐行读取,或者awk脚本调用system date,会很慢,进程太多。您必须使用简单的 awk、Perl、Python 或任何脚本。所有语言都具有用于格式之间转换的标准日期时间函数。

这里这里是一些很好的参考。如果你想使用 GNUawk 时间函数并且strftime(),您的情况所需的只是选择纪元子字符串(不包括毫秒):

$ awk '{$1 = strftime("%F %T", substr($1,1,10))} 1' file
2018-04-02 21:25:24 entity1,sometext
2018-04-02 21:25:41 entity2,sometext
2018-04-02 21:25:47 entity1,sometext

或者一起打印毫秒:

$ awk '{$1 = strftime("%F %T", substr($1,1,10)) "." substr($1,11)} 1' file
2018-04-02 21:25:24.403 entity1,sometext
2018-04-02 21:25:41.466 entity2,sometext
2018-04-02 21:25:47.273 entity1,sometext

或者打印日-月-年格式:

$ awk '{$1 = strftime("%d-%m-%Y %T", substr($1,1,10))} 1' file
02-04-2018 21:25:24 entity1,sometext
02-04-2018 21:25:41 entity2,sometext
02-04-2018 21:25:47 entity1,sometext

答案2

这不是您可以使用 bash 命令完成的操作,您需要一个外部程序,因为 bash 无法执行浮点数学并且无法处理日期。我怀疑你只是指“在命令行上”,而你实际上并不需要纯粹的 bash 解决方案。有了这个假设,这里有一个gawk(GNU awk)解决方案:

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:24 entity1,sometext
02.04.2018 19:04:41 entity2,sometext
02.04.2018 19:04:47 entity1,sometext

strftime函数将时间戳转换为日期。由于您的单位是毫秒,因此我们将sprintf其转换为秒。最后一个1;只是告诉我们在将新值分配给(第一个字段)gawk后打印该行。$1


请记住,输出将取决于您的时区。例如,上面的代码是在设置为 GMT 时区的计算机上运行的。这就是为什么我的数字与中的数字不同的原因@thanasisp 的回答这大概是在不同的时区运行的。您可以通过TZ在运行命令时设置变量来控制它并更改输出。例如,比较一下:

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:02.24 entity1,sometext
02.04.2018 19:04:02.41 entity2,sometext
02.04.2018 19:04:02.47 entity1,sometext

对此:

$ TZ=America/Los_Angeles gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 11:04:02.24 entity1,sometext
02.04.2018 11:04:02.41 entity2,sometext
02.04.2018 11:04:02.47 entity1,sometext

或这个:

$ TZ=Asia/Tokyo gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
03.04.2018 03:04:03.24 entity1,sometext
03.04.2018 03:04:03.41 entity2,sometext
03.04.2018 03:04:03.47 entity1,sometext

相关内容