我有一个日志文件,其中包含我需要捕获的 2 个不同事件(以及其他事件)。
每个事件都会在日志文件中生成一个单独的专用行,格式如下:
时间戳 - PID - 过程 - 事件类型 - 事件详情
我什么都不关心,除了事件详情文件的列以及我期望在那里收到的数据如下所示:
示例1: { "values":{ "SPEED":"7.0" } }
示例2: { "values":{ "CADENCE":"41" } }
我一直在尝试编写一个 shell 脚本,每次只读取日志文件的最后一行,并且取决于日志文件的内容事件详情列,重定向结果速度或者节奏数据到特定的文本文件(当我说结果速度/踏频数据我的意思是“整数”之后速度”:”表达式为例)。
到目前为止,我能够将结果重定向到两个不同的文件,但是:
- 我必须“尾随”日志文件两次才能使脚本正常工作并且......
- ...因此,我感觉第二个文件的更新速度与第一个文件的更新速度不同...就好像,由于某种原因,我错过了一些文件节奏事件因脚本编写顺序而异。
我尝试使用睡觉函数,并且还尝试一次“尾随”多行以尝试缓解 CADENCE 更新的缺乏,但没有成功。我只是时不时地错过 CADENCE 事件。
关于日志文件行为的注释:查看日志,大多数时间出现 3 个事件,并且它们始终以相同的出现顺序记录(CADENCE、SPEED 和 OTHER),并且时不时出现第 4 个事件。我只是想澄清一下,丢失的 CADENCE 事件与“第四”事件的出现无关。
这是我当前运行的脚本的摘要版本:
#!/bin/bash
while :
do
tail -1 logfile.txt | grep -oP '(?<=SPEED":")[0-9]+' > spd.txt
tail -1 logfile.txt | grep -oP '(?<=CADENCE":")[0-9]+' > cad.txt
done
======更新:========
这是完整的日志行和预期的输出:
第 1 行的示例:
输入(来自 logfile.txt):
03-16 21:05:28.641 2797-2842/process:Service D/WEBSOCKET: 接收: { "values":{ "Speed MPH":"3.1", "Speed KPH":"4.9", "Miles":" 0.551", "公里":"0.886" } }
输出(发送到 spd.txt):
4.9
第 2 行示例:
输入(来自 logfile.txt):
03-16 21:05:29.309 2797-2842/process:Service D/WEBSOCKET: 接收: { "values":{ "RPM":"27" } }
输出:(发送到 cad.txt):
27
答案1
这里不需要 while 循环...
tail -f logfile.txt | awk '/SPEED/{print >"spd.txt"}/CADENCE/{print >"cad.txt"}'
答案2
明白了,卡马拉吉,感谢您的帮助!找到正确答案的关键是:
这是对我有用的脚本:
尾部-1 日志文件.txt | awk -F"\":\"" '{for (c=1;c<=NF;c++) {if ($c ~ /Speed KPH/) {print $(c+1)+0 > "spd. txt"} {if ($c ~ /RPM/) {print $(c+1)+0 > "cad.txt"}}}}'
不得不回去尾部-1因为尾部-f受到缓冲的影响,它还会在 txt 文件中留下一条记录,其中包含捕获的所有值。我只期待输出文本文件中包含最新结果的一行。
谢谢并致以诚挚的问候!