grep命令按顺序提取长度为2的所有序列

时间:2018-04-19 23:02:23

标签: bash macos grep

我想从otool命令输出中提取机器代码。

otool -t someFile输出,例如。

0000000000000000    48 31 ff 40 b7 02 48 31 f6 40 b6 01 48 31 d2 48 
.
.
0000000000000070    c8 28 b0 3b 52 68 2f 2f 62 69 0f 05

如何使用grep提取每个十六进制值或2个字符的序列并将它们添加到字符串中,然后才能在每个字符串之前添加\x

2 个答案:

答案 0 :(得分:1)

You could use xargs with grep regex:

otool -t file | grep -ioE "(?:\t)([A-Z0-9]{2}\s)+" | xargs printf "\\\x%s"

Output should look something like this:

\x55\x48\x89\xe5\x48\x83\xec\x10\x48\x8d\x05 ...

答案 1 :(得分:1)

如果您的第一个odtool输出字段被其他选项卡分隔,那么这可能是您正在寻找的内容:

otool -t someFile | awk -F'\t' '{gsub(/^| /,"\\x",$2); print $2}'

e.g。

$ cat file
0000000000000000        48 31 ff 40 b7 02 48 31 f6 40 b6 01 48 31 d2 48
0000000000000070        c8 28 b0 3b 52 68 2f 2f 62 69 0f 05

$ awk -F'\t' '{gsub(/^| /,"\\x",$2); print $2}' file
\x48\x31\xff\x40\xb7\x02\x48\x31\xf6\x40\xb6\x01\x48\x31\xd2\x48
\xc8\x28\xb0\x3b\x52\x68\x2f\x2f\x62\x69\x0f\x05

鉴于以下来自l'L'l的评论暗示在行尾有空白行和空白字符要忽略,这可能是你真正想要的:

otool -t someFile | awk -F'\t' 'NF>1{sub(/ +$/,""); gsub(/^| /,"\\x",$2); print $2}'