使用regex通过命令行从二进制流中获取数据



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

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

我希望使用它来查看错误消息的流并将其重定向到一个文件。任何关于如何修复这个正则表达式的建议都将非常感谢。

grep基本上是一个面向行的工具。如果这129个字节可能包含空字节或其他什么,那么所有的赌注都将被取消;也许可以试试

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

,其中-z选项是非标准的,并表示使用空字节而不是换行符作为"lines";之间的分隔符。-o选项表示只打印匹配的部分,而不是整行"找到匹配项的地方。

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

grep只是过滤可以找到$ERROR的行。如果你想对它做一些处理,你需要更进一步,比如使用cut,就像这个例子:

cat file.txt | cut -c 1-10

这只显示文件每行的前十个字符。

所以,你的解决方案可以是:

cat file.bin | grep -aEi '($ERROR).{129}' | cut -c 1-10

显然,由于文件包含二进制字符,您可能需要使用cut -b来切割字节:

cat file.bin | grep -aEi '($ERROR).{129}' | cut -b 1-10

编辑正如tripleee所评论的那样,这可以改进为:

grep -aEi '($ERROR).{129}' file.bin | cut -b 1-10

相关内容

  • 没有找到相关文章

最新更新