我有一个实时运行的日志尾巴,并使用名为"test.txt"的"脚本"命令在/home/pi/上实时保存到文本文件中。现在,我想设置一个过程,不断轮询该文本文件以进行更改并删除特定的重复数据位。例如,日志的某个部分如下所示:
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 /(dd:dd):dd.*query[A]( S+)/' > test.txt
随着文件my.log
的增长,-f
不断输出最后一行。它将行馈送到小的perl单行程序中,该程序查找query[A]
(转义[
并用]
字符,因为它们在正则表达式中具有特殊含义(,并在找到时输出以小时和分钟为单位的时间以及正则表达式捕获的域名到$1
和$2
。