首页 > 解决方案 > 使用正则表达式通过命令行从二进制流中获取数据

问题描述

我有一个 hacky 的事情,我想通过命令行来做,因为我不想写一个程序来做这件事。对于某些背景,传感器只是发送简单地被 netcat 捕获的 UDP 数据包,nc -ul 192.168.1.1 10000 > output.dat. 在此流中,偶尔会出现错误。我有一个来自传感器的二进制数据流,它偶尔会发送错误消息“$ERROR<binary for 129 bytes>”。

我想想出一些方法来解析这个错误消息,这样我就可以将匹配项通过管道传输到一个文件中。我相信正确的正则表达式是(\$ERROR).{129},但我没有实际实施它的运气。我一直在模拟数据流,cat file.bin | grep -aEi '(\$ERROR).{129}'但它不起作用,因为我得到的字符多于错误消息。

我希望使用它来观看错误消息的流并将其重定向到文件。任何有关如何修复此正则表达式的建议将不胜感激。

标签: regexcommand-linegrep

解决方案


grep本质上是一个面向行的工具。如果这 129 个字节可能包含空字节或你有什么,那么所有的赌注都没有;但也许试试

grep -zEo '$ERROR.{129}' file.bin

其中-z选项是非标准的,并表示使用空字节而不是换行符作为“行”之间的分隔符;并且该-o选项说只打印匹配项,而不是找到匹配项的整个“行”。

周围的括号$ERROR没有任何用处,所以我把它们去掉了。


推荐阅读