在将文本写入文件之前,如何预处理无限的文本流?

时间:2012-08-02 17:58:24

标签: php bash networking logging stream

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

流的某些行包含字节计数,如果我看到字节计数(例如,800字节),那么我需要将接下来的800字节记录到文件中。如果没有,我希望不写信息。

对我来说,最好的方法是对流进行这种“即时预处理”以决定重定向到日志文件的内容?某种正在侦听流的第二个守护程序脚本,它被传送到该脚本?

示例:

我在流中看到以下行:

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

首先,我需要检查它是否有“设置”。然后,我检查该行的最后一部分(1429),然后读取下一个1429字节并将其写入文件。

3 个答案:

答案 0 :(得分:1)

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

假设您有一个名为'capture'的可执行文件和一个名为'filter'的过滤程序,您可以使用

将它们从bash shell链接在一起
bash-prompt$ capture capture-params | filter

capture写入stdout的任何内容都将作为stdin的输入提供给filter。从过滤器的角度来看,读取线条很简单,当找到结束...大小模式时,将输出写入输出文件(或再次输出到标准输出)。如果您写入stdout,则可以使用

将其重定向到文件
bash-prompt$ capture capture-params | filter > output-file.txt

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

到目前为止,您所描述的最优雅的应用程序是使用低占用率的循环数据库。 RRDtool是OpenSource行业标准,高性能数据记录和图形。

使用bash命令可以将数据输入数据库,如果选择,绘图也很简单。

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