You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过命令行用正则从二进制流中提取$ERROR格式错误数据

问题原因
  • 你使用的grep默认按行匹配输出,未加-o参数时会输出匹配内容所在的完整行。二进制数据流无明确换行符,会导致输出内容为匹配位置所在的整个缓冲区,长度远超预期
  • 未加-z参数时,grep默认将\n识别为行终止符,正则中的.元字符不会匹配换行符,遇到包含换行的错误包时会出现匹配失败或长度不足的问题
  • 多余的-i(忽略大小写)参数可能匹配到非预期的小写错误标识,增加误判概率
可行方案

方案1:修正grep参数实现(推荐,原生工具无需额外依赖)

离线测试命令(处理已保存的二进制文件)

cat file.bin | grep -aEzo '\$ERROR.{129}'

参数说明:

  • -a:将二进制文件视为文本处理
  • -E:启用扩展正则表达式
  • -z:使用NUL作为行分隔符,避免换行符截断匹配内容
  • -o:仅输出匹配到的内容片段,而非整行

实时监听提取命令

如果需要实时处理UDP流并将错误写入文件,直接将netcat输出通过管道传递给grep即可:

nc -ul 192.168.1.1 10000 | grep -aEzo --line-buffered '\$ERROR.{129}' >> error.log

新增--line-buffered参数关闭输出缓存,保证错误日志实时写入。

如果需要同时保存原始捕获数据和错误日志,使用tee分流:

nc -ul 192.168.1.1 10000 | tee output.dat | grep -aEzo --line-buffered '\$ERROR.{129}' >> error.log

方案2:Perl单行命令实现(兼容性更强,适合复杂二进制场景)

如果grep处理极端二进制场景存在匹配偏移问题,可以用Perl按固定长度读取匹配,稳定性更高:

nc -ul 192.168.1.1 10000 | perl -ne 'BEGIN{$/=\134} print if /^\$ERROR/' >> error.log

逻辑说明:将输入记录分隔符设为134字节($ERROR6字节 + 后续129字节内容),每次读取134字节判断开头是否匹配错误标识,匹配则输出。

内容的提问来源于stack exchange,提问作者b degnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:18:02