首页 > 解决方案 > 轮询不断更新的文本文件以剪切选定的信息

问题描述

我有一个实时运行的日志尾,并使用 /home/pi/ 上名为“test.txt”的“脚本”命令也实时保存到文本文件中。现在我想建立一个进程,不断轮询该文本文件以进行更改并删除特定的重复出现的数据位。例如,日志的一部分如下所示:

Feb  9 11:43:24 dnsmasq[887]: query[A] captive.g.aaplimg.com from 192.168.178.21
Feb  9 11:43:24 dnsmasq[887]: forwarded captive.g.aaplimg.com to 8.8.4.4
Feb  9 11:43:24 dnsmasq[887]: reply captive.g.aaplimg.com is 17.253.55.202
Feb  9 11:43:24 dnsmasq[887]: reply captive.g.aaplimg.com is 17.253.57.211
Feb  9 11:43:54 dnsmasq[887]: query[A] captive.g.aaplimg.com from 192.168.178.21

而且我只想从带有 query[A] 的行中剪切信息(假设可以用作标记),以便输出文本如下所示:

11:43 captive.g.aaplimg.com

但问题是日志的这一行附加了不同的 URL,因此例如带有 'query[A]' 的行也可能如下所示:

Feb  9 11:49:56 dnsmasq[887]: query[A] www.googleapis.com from 192.168.178.21

然后我希望输出为:

11:49 www.googleapis.com

但它需要实时发生,因为文本文件/日志正在更新,因为我希望这个文本文件不断轮询并实时发送到打印机(说来话长)

我一直在查看 awk + ​​sed 来删除我需要的信息,但它们对我来说是新的,所以我发现格式有点混乱,而且我发现特别难以弄清楚如何运行它所以它会发生在真实的时间。

在 pi 上运行 debian buster。

希望得到一些帮助!谢谢

标签: perlawkgrepreal-timetext-processing

解决方案


我假设您正在寻找这样的东西:

tail -f my.log | perl -nle 'print"$1$2" if /(\d\d:\d\d):\d\d.*query\[A\]( \S+)/' > test.txt

随着文件的增长,-f不断输出最后几行my.log。它将这些行输入到小的 perl 单行程序中,该程序查找query[A](转义[]字符,\因为它们在正则表达式中具有特殊含义),并在找到时输出小时和分钟的时间以及正则表达式捕获的域名到$1$2.


推荐阅读