bash将csv尾部的纪元时间转换为人类可读

Posted

技术标签:

【中文标题】bash将csv尾部的纪元时间转换为人类可读【英文标题】:bash convert epoch time in tail of csv to human readable 【发布时间】:2021-10-31 10:20:24 【问题描述】:

我花了几个小时搜索了几十个 *** 问题,它们让我更接近我的答案,但并非完全如此。

我正在尝试将几个 bash 命令合并为一个;尾随 csv 日志文件,并将 epoch dtstamp 动态转换为人类可读的。到目前为止,我已经完成了以下步骤:

#1。从日志文件中获取我想要的列:

tail -F config.log |awk -F, 'printf $1printf $3printf $4printf "   "print    $5'
AW.BS._74.OD              3.000   0001630507243.820532   Local User
AW.BS._74.OnAction        3       0001630507243.820532   Local User
AW.BS._75.OfD             3.000   0001630507243.821193   Local User
AW.BS._75.OD              3.000   0001630507243.821193   Local User
AW.BS._75.OA              3       0001630507243.821193   Local User
AW.BS._76.OfD             3.000   0001630507243.821857   Local User
AW.BS._76.OD              3.000   0001630507243.821857   Local User
AW.BS._76.OA              3       0001630507243.821857   Local User
T.C._5.T.A._2.I                   0001630511595.829306   Local User
T.C._5.T.A._2.I                   0001630540127.214874   Local User

#2。自行提取纪元

tail -F config.log |awk -F, 'print $4'
0001630507243.820532
0001630507243.820532
0001630507243.821193
0001630507243.821193
0001630507243.821193
0001630507243.821857
0001630507243.821857
0001630507243.821857
0001630511595.829306
0001630540127.214874

#3。 date 不喜欢它正在转换的纪元时间的前导零或尾随小数,因此请删除它们:

tail config.log |awk -F, 'print $4' |sed 's/^0*//' |sed 's/\.[^\.]*$//'

1630507243
1630507243
1630507243
1630507243
1630507243
1630507243
1630507243
1630507243
1630507243
1630511595

但是 - 如果我将 -F 与尾部一起使用,则此步骤不起作用。 :(

#4 测试日期转换:适用于静态纪元时间:

date -d @1630540127
Wed Sep  1 23:48:47 GMT 2021

因此,我可以自己完成每个部分,但我无法将它们组合起来以查看日志文件的实时更新,其中显示第 1、3、 5。

我错过了什么?

感谢各位大师的帮助。

【问题讨论】:

永远不要使用printf $1,总是使用printf "%s", $1,因为当输入包含诸如%s 之类的printf 格式字符串时,前者会失败。这适用于将 printf 与任何输入数据一起使用。 【参考方案1】:

试试这个 GNU awk

$ TZ=GMT awk ' s=strftime("%a %b %d %T %Z %Y",$(NF-2));print $0,s ' scott.txt
AW.BS._74.OD              3.000   0001630507243.820532   Local User Wed Sep 01 14:40:43 GMT 2021
AW.BS._74.OnAction        3       0001630507243.820532   Local User Wed Sep 01 14:40:43 GMT 2021
AW.BS._75.OfD             3.000   0001630507243.821193   Local User Wed Sep 01 14:40:43 GMT 2021
AW.BS._75.OD              3.000   0001630507243.821193   Local User Wed Sep 01 14:40:43 GMT 2021
AW.BS._75.OA              3       0001630507243.821193   Local User Wed Sep 01 14:40:43 GMT 2021
AW.BS._76.OfD             3.000   0001630507243.821857   Local User Wed Sep 01 14:40:43 GMT 2021
AW.BS._76.OD              3.000   0001630507243.821857   Local User Wed Sep 01 14:40:43 GMT 2021
AW.BS._76.OA              3       0001630507243.821857   Local User Wed Sep 01 14:40:43 GMT 2021
T.C._5.T.A._2.I                   0001630511595.829306   Local User Wed Sep 01 15:53:15 GMT 2021
T.C._5.T.A._2.I                   0001630540127.214874   Local User Wed Sep 01 23:48:47 GMT 2021

【讨论】:

感谢 @stack0114106,不幸的是我的 Linux 版本(嵌入式设备的紧凑型,我无法添加)不知道 strftime 是什么。 :( @Scott awk --version 输出什么? Linux 通常带有 GNU awk,如果你有 GNU date 和 GNU tail(正如你的问题告诉我们你使用的选项)但没有 GNU awk,你会很奇怪,strftime() 有加入 GNU awk 已经 11 年了,所以如果你有一个没有它的 gawk 版本会很奇怪。 @EdMorton: [user@Dreadnaught /]$ awk --version awk: unrecognized option '--version' BusyBox v1.17.1 (2021-04-05 12:13:07 IST) 多调用二进制。用法:awk [OPTIONS] [AWK_PROGRAM] [FILE]... 选项:-v VAR=VAL 设置变量 -F SEP 使用 SEP 作为字段分隔符 -f FILE 从文件中读取程序 [user@Dreadnaught /bin]$ l |grep awk lrwxrwxrwx 1 root root 7 Apr 5 07:20 awk -> busybox 这是 BusyBox,一个用于低功耗控制器的嵌入式 Linux。 看起来您使用的是 BusyBox awk 而不是 GNU awk。它可能已经在您的系统上,但不是您的 PATH 中的第一个,因此请查看它,如果它不存在,请安装它,因为它在 BusyBox awk 上具有大量有用的功能。 很遗憾,我无法安装程序,控制器操作系统已构建并修复。我可以修改所有的配置文件,但我不能安装新程序。

以上是关于bash将csv尾部的纪元时间转换为人类可读的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OSX 上将 unix 纪元时间转换为人类可读的日期 - BSD

如何将纳秒的纪元时间转换为人类可读的?

将纪元转换为人类可读的日期在 python 中不起作用

如何在 Teradata 中将纪元时间转换为人类可读

在mysql中将纪元数转换为人类可读的日期

使用 Java 将 unix 纪元转换为人类可读时的日期不正确