如何在将无限的文本流写入文件之前对其进行预处理?
Posted
技术标签:
【中文标题】如何在将无限的文本流写入文件之前对其进行预处理?【英文标题】:How do I pre-process an infinite stream of text before writing it to a file? 【发布时间】:2012-07-31 18:15:34 【问题描述】:我正在使用 tcpflow 在服务器上记录网络流量。我想将此数据记录到文件中,但不是全部。监控进程将无限期地作为守护进程在后台运行。
流的某些行包含一个字节数,如果我看到该字节数(比如 800 个字节),那么我需要将接下来的 800 个字节记录到文件中。如果没有,我希望不写入文件。
对我来说,对流进行这种“即时预处理”以决定将什么重定向到日志文件的最佳方式是什么?某种正在侦听流的第二个守护程序脚本,它通过管道传输到该脚本?
例子:
我在流中看到以下行:
1343932842: 010.079.091.189.35856-010.104.001.199.11211: set i:1:20163484235 0 0 1429
首先,我需要检查它是否有一个“集合”。然后,我检查该行的最后一段 (1429),然后读取接下来的 1429 个字节并将其写入文件。
【问题讨论】:
看起来 tcpflow 支持像 tcpdump 这样的过滤表达式 @jordanm 我认为这对我没有帮助。这是一个示例行:1343932842: 010.079.091.189.35856-010.104.001.199.11211: set i:1:20163484235 0 0 1429
我需要首先看到该行有一个“集合”,然后检查该行的最后一段 (1429),然后读取接下来的 1429 个字节并将其写入文件。
你用什么语言写这个?这是在什么环境下执行的?标签“bash”和“php”令人困惑......
二进制 TCP 流可以包含任何数据,包括换行符;你确定只有文字吗?否则,您需要确保将“控制线”(如您的示例)与实际数据分开......
@tucuxi 生成流的进程是从 C 编译的二进制文件,从命令行运行。保证返回文本数据。
【参考方案1】:
是的,使用一个将流作为输入的守护程序,并按照您的描述进行操作。我会推荐 C 而不是脚本,因为它的输入/输出非常简单,而且开销非常低。
假设您有一个名为“capture”的可执行文件和一个名为“filter”的过滤程序,您可以使用 bash shell 将它们链接在一起
bash-prompt$ capture capture-params | filter
capture
写入标准输出的任何内容都将作为标准输入的输入提供给filter
。从过滤器的角度来看,读取行是一件简单的事情,当找到 end ... size 模式时,将输出写入输出文件(或再次写入 stdout)。如果您写入标准输出,则可以使用
bash-prompt$ capture capture-params | filter > output-file.txt
【讨论】:
如何将两者连接起来?我是否有第二个 C 程序调用 shell 来启动第一个生成流的程序?我是否让第一个程序写入第二个程序读取的临时文件? (我宁愿不使用那个解决方案)。 添加了一些使用 bash 进行链接的示例。这在很大程度上是“unix 方式”的处理方式:将单件事情做得很好的小程序组合成更大的程序。 谢谢。那么,“过滤器”程序是否会是一个基本上是无限循环的 C 程序,反复读取标准输入,解析/处理它,然后写入标准输出?过滤器程序是否必须用 C 编译?它可以只是一个 PHP 脚本吗? 对第一部分是的(filter
将如何工作);至于第二部分,是的,您可以使用***.com/questions/554760/php-standard-input 在 PHP 中进行标准输入/输出。
这是正确的做法。实际上,旨在从标准输入读取、转换输入并写入标准输出的程序的通用术语是“过滤器”。 en.wikipedia.org/wiki/Filter_(Unix) 有很多现有的通用过滤器。您可以使用它们而不是自己编写。我引用的***页面有很多你可以调查的。请注意,大多数现有的都适用于纯文本,而不是二进制文件。对于二进制文件,您的选择较少,可能需要自己编写。【参考方案2】:
您可以使用 awk 进行动态文本处理。您将需要学习该语言,但我在实时日志解析中用于类似任务。我做tail -f file.log | awk -f myscript.awk
每一行都将通过您创建的 awk 脚本进行分析,使用 if-then-else,您可以检测该行中存在的一些单词并激活 awk 代码的其他部分以不同方式解析该行,甚至运行外部程序。
【讨论】:
【参考方案3】:到目前为止,您所描述的最优雅的应用程序是使用低占用空间的循环数据库。 RRDtool 是开源行业标准、高性能数据记录和绘图。
使用 bash 命令可以将数据输入到数据库中,如果您愿意,绘制图表也非常简单。
查看: http://oss.oetiker.ch/rrdtool/gallery/index.en.html
【讨论】:
以上是关于如何在将无限的文本流写入文件之前对其进行预处理?的主要内容,如果未能解决你的问题,请参考以下文章
如何在将密码保存到用户模型 Django 之前对其进行加密?
如何在将 json 发布到 React 组件状态之前对其进行处理?
在将 SCNPhysicsVehicleWheels 导入 Xcode 之前对其进行缩放