以下是这种情况:我必须在hexdump
的输出中找到字符串A和字符串B之间的字节.hexdump的结构类似于:
-random bytes
-A + useful bytes + B
-random bytes
-A + useful bytes + B
-random bytes
现在,问题是: - 是否可以“从A到B”?我在手册页或互联网上没有看到类似的东西。我知道我可以手动完成,但我需要编写脚本。 - 是否可以显示没有行号的hexdump输出?这似乎很合理,但我还没有找到办法。
谢谢!
答案 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)
运行每一个。