使用正则表达式通过命令行从二进制流中获取数据

Using regex to get data from a binary stream via the command line

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

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

我希望用它来监视流中的错误消息并将其重定向到文件。非常感谢任何有关如何修复此正则表达式的建议。

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

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

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

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

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