使用sed从原始usb转储中提取十六进制字节



这是原始usb转储中的一行:

Id  Type                        Time        Length   Hex             Ascii
16  Out (USB URB Function: 45)  0.01513     2048     a3 e8 55 cc      correpondant ascii

请注意,Id、Type、Time、Length一直在变化,并且十六进制字节的数量非常巨大。

我想做的是擦除除十六进制字节之外的所有内容。我想用sed来代替所有不是一对数字/[从a到F]的字母]和两个空格之间的东西:

sed -E 's/([^ ][^a-f0-9][^a-f0-9][^ ])//g' <orig >new

但它给了我:

1Uun)   0.015013    2048    a3 e8 55 cc  

并且只有ascii的某些部分被擦除。

我在上面的基础上尝试了一些其他sed命令,但也不起作用。

有什么想法吗?谢谢

或者如果有分隔符,只使用awk 'print $4'

sed可能不是这项工作的最佳工具。我个人会用Python或类似的语言编写一个解析器。

然而,如果您想使用终端中的正则表达式来获取它,也许可以使用grep:

% grep -o '(b[[:xdigit:]]{2}[[:space:]])+' orig 
16 
a3 e8 55 cc 

请注意,"16"是一个十六进制对。

cut命令怎么样?

或者将Johnyweb的想法再进一步,

$:> printf "16  Out (USB URB Function: 45)  0.01513     2048     a3 e8 55 cc      correpondant asciin" 
| grep -o '(b[[:xdigit:]]{2}[[:space:]]b[[:xdigit:]]{2}[[:space:]])+'

产生

a3 e8 55 cc

如果您有一个可以依赖的新GNU sed,那么您应该能够轻松地将grep-regex转换为sed。

并且,为了说明buruzaemon的切割技术

$:> printf "16  Out (USB URB Function: 45)  0.01513     2048     a3 e8 55 cc      correpondant asciin" 
| cut -c54-66

产生

a3 e8 55 cc

但这是假设您的ID列(以及其他列)不会改变大小。

我希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新