【发布时间】: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 与任何输入数据一起使用。