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 是什么。 :( @Scottawk --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尾部的纪元时间转换为人类可读的主要内容,如果未能解决你的问题,请参考以下文章