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

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

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

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

tail -F config.log |awk -F, '{printf $1}{printf $3}{printf $4}{printf "   "}{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 与任何输入数据一起使用。

标签: awk printf epoch tail


【解决方案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 上具有大量有用的功能。
  • 很遗憾,我无法安装程序,控制器操作系统已构建并修复。我可以修改所有的配置文件,但我不能安装新程序。
猜你喜欢
  • 2012-08-16
  • 2013-01-13
  • 2015-09-28
  • 2012-11-12
  • 2017-05-23
  • 2020-09-29
  • 2017-04-06
  • 2021-03-30
  • 2019-12-03
相关资源
最近更新 更多