在将无限文本流写入文件之前,我如何对其进行预处理


How do I pre-process an infinite stream of text before writing it to a file?

我正在使用tcpflow来记录服务器上的网络流量。我想将这些数据记录到一个文件中,但不是所有。监控进程将无限期地作为后台进程运行。

流的一些行包括字节计数,如果我看到这个字节计数(比如800字节),那么我需要将接下来的800字节记录到文件中。如果没有,我不希望写入该文件。

对我来说,对流进行这种"动态预处理"以决定重定向到日志文件的内容的最佳方法是什么?某种正在侦听流的第二个守护进程脚本,该脚本通过管道传输到该脚本?

示例:

我在流中看到以下行:

1343932842: 010.079.091.189.35856-010.104.001.199.11211: set i:1:20163484235 0 0 1429

首先,我需要检查它是否有一个"集合"。然后,我检查这行的最后一段(1429),然后读取接下来的1429个字节并将其写入文件。

是的,使用一个将流作为输入的守护程序,并按照您所描述的进行操作。我建议使用C而不是脚本,因为它具有非常直接的输入/输出,并且开销非常低。

假设你有一个名为"capture"的可执行文件和一个称为"filter"的过滤程序,你可以使用从bash shell将它们链接在一起

bash-prompt$ capture capture-params | filter

capture写入stdout的任何内容都将作为stdin的输入提供给filter。从过滤器的角度来看,这是一个简单的问题,即读取行,以及何时结束。。。找到大小模式,将输出写入输出文件(或再次写入stdout)。如果您写入stdout,则可以使用将其重定向到文件

bash-prompt$ capture capture-params | filter > output-file.txt

您可以使用awk进行即时文本处理。您需要学习该语言,但我在实时日志解析中用于类似的任务。我做尾部-f文件.log | awk-f myscript.awk

每一行都将通过您创建的awk脚本进行分析,使用if-then-else,您可以检测行中存在的一些单词,并激活awk代码的其他部分,以不同的方式解析行,甚至运行外部程序。

到目前为止,您所描述的最优雅的应用程序是使用低占用空间的循环数据库。RRDtool是开源行业标准,具有高性能的数据记录和绘图功能。

使用bash命令,您可以将数据输入到数据库中,如果您选择这样做,绘制数据图也非常简单。

请参阅:http://oss.oetiker.ch/rrdtool/gallery/index.en.html