perl - 轮询不断更新的文本文件以剪切选定的信息
问题描述
我有一个实时运行的日志尾,并使用 /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。
希望得到一些帮助!谢谢
解决方案
我假设您正在寻找这样的东西:
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
.
推荐阅读
- python - 仅熊猫日期时间列的时间分量平均值
- npm - 复制“npm pack”行为
- excel - PRODUCT IF - 多重标准
- php - Codeigniter 下午不从服务器发送电子邮件
- c++ - 在 Visual Studio 中调试 Qt,缺少 msvcp140d_app.dll
- spring-boot - 在 SpringBoot 中重试连接到 RabbitMQ 和 MongoDB
- python - 我想从用户那里获取输入,直到给出一个字符串。如果插入了 int 或 float ,它将继续插入该值
- mysql - 用户单击表格行时显示详细信息
- python - Selenium - 使用当前 Chrome 实例的会话
- java - Tomcat Jersey 在“OPTIONS”飞行前请求中阻止服务器