根据捕获内容将 GREP 输出重定向到不同的文本文件

根据捕获内容将 GREP 输出重定向到不同的文本文件

我有一个日志文件,其中包含我需要捕获的 2 个不同事件(以及其他事件)。

每个事件都会在日志文件中生成一个单独的专用行,格式如下:

时间戳 - PID - 过程 - 事件类型 - 事件详情

我什么都不关心,除了事件详情文件的列以及我期望在那里收到的数据如下所示:

示例1: { "values":{ "SPEED":"7.0" } }

示例2: { "values":{ "CADENCE":"41" } }

我一直在尝试编写一个 shell 脚本,每次只读取日志文件的最后一行,并且取决于日志文件的内容事件详情列,重定向结果速度或者节奏数据到特定的文本文件(当我说结果速度/踏频数据我的意思是“整数”之后速度”:”表达式为例)。

到目前为止,我能够将结果重定向到两个不同的文件,但是:

  1. 我必须“尾随”日志文件两次才能使脚本正常工作并且......
  2. ...因此,我感觉第二个文件的更新速度与第一个文件的更新速度不同...就好像,由于某种原因,我错过了一些文件节奏事件因脚本编写顺序而异。

我尝试使用睡觉函数,并且还尝试一次“尾随”多行以尝试缓解 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 文件中留下一条记录,其中包含捕获的所有值。我只期待输出文本文件中包含最新结果的一行。

谢谢并致以诚挚的问候!

相关内容