0

情况如下:我必须在字符串 A 和字符串 B 之间的字节的输出中找到。hexdumphexdump 的结构类似于:

-random bytes
-A + useful bytes + B
-random bytes
-A + useful bytes + B
-random bytes

现在,问题是: - 是否可以 grep “从 A 到 B”?我在手册页或互联网上没有看到类似的内容。我知道我可以手动完成,但我需要编写脚本。- 是否可以在没有行号的情况下显示 hexdump 输出?这似乎很合理,但我还没有找到方法。

谢谢!

4

2 回答 2

1

您可以使用类似 Perl 的环视断言来匹配 A 和 B 之间的所有内容,不包括 A 和 B:

$ echo 'TEST test A foo bar B test' | grep -oP '(?<=A).*(?=B)'
 foo bar 

但是,考虑到迈克尔的回答,您必须将hexdump输出转换为单个字符串才能使用grep. 您可以在途中去掉“行号”:

hexdump filename | sed -r 's/\S{5,}//g' | tr '\n' ' '

或更好

hexdump filename | cut -d ' ' -f 2- | tr '\n' ' '

现在一切都在一条线上,所以grep必须是懒惰的,而不是贪婪的:

$ echo 'TEST test A foo bar B test A bar foo B test' | grep -oP '(?<=A).*?(?=B)'
 foo bar 
 bar foo 

但迈克尔有一点,也许你应该使用更高级的东西,至少如果你需要不止一次这样做。

PS如果您可以在比赛中包括A和B,那就做

$ echo 'TEST test A foo bar B test A bar foo B test' | grep -oP 'A.*?B'
A foo bar B
A bar foo B
于 2012-05-08T17:59:31.413 回答
0

grep程序一次只能在一行上运行;您将无法让它在十六进制转储上智能地工作。

我的建议:使用 perl 或 ruby​​ 或您最喜欢的脚本语言中的正则表达式功能,对字符串的原始二进制数据进行 grep。红宝石中的这个例子:

ARGF.read.force_encoding("BINARY").scan(/STR1(.*?)STR2/);

这将生成一个数组,其中包含 STR1 和 STR2 出现之间的所有二进制字符串。从那里你可以运行每一个hexdump(1)

于 2012-05-08T17:48:28.820 回答