在hexdump的输出中,从A到B“grep”

时间:2012-05-08 17:27:03

标签: grep hexdump

以下是这种情况:我必须在hexdump的输出中找到字符串A和字符串B之间的字节.hexdump的结构类似于:

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

但是,考虑到Michael's answer,您必须将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 

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

P.S。如果你可以在比赛中包括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

答案 1 :(得分:0)

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

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

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

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