我有一个具有以下结构的日志文件
例子:
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