首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在linux/unix/bash脚本中的文件中搜索十六进制内容?

如何在linux/unix/bash脚本中的文件中搜索十六进制内容?
EN

Stack Overflow用户
提问于 2020-05-03 16:38:30
回答 2查看 1.3K关注 0票数 0

我有一个十六进制字符串s和一个文件f,我需要搜索该字符串在文件中的第一次出现,并将其保存在一个带有他的偏移量的变量中。我认为正确的方法是将文件转换为十六进制,然后使用grep搜索该文件。主要的问题是我看到了很多命令(十六进制、xxd等等)。去皈依但却没有一个真正起作用。有什么建议吗?我的尝试是这样的:

代码语言:javascript
运行
复制
xxd -plain $f > $f
grep "$s" .

产出应如下:

代码语言:javascript
运行
复制
> offset:filename
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-04 04:40:42

没有任何错误处理的第一种方法可能如下所示

代码语言:javascript
运行
复制
#!/bin/bash

BINFILE=$1
SEARCHSTRING=$2

HEXSTRING=$(xxd -p ${BINFILE} | tr -d "\n")
echo "${HEXSTRING}"

echo "Searching ${SEARCHSTRING}"
OFFSET=$(grep -aob ${SEARCHSTRING} <<< ${HEXSTRING} | cut -d ":" -f 1)

echo ${OFFSET}:${BINFILE}

我在这里使用xxd是因为Does hexdump respect the endianness of its system?。请注意,根据How to find a position of a character using grep?grep将返回多个匹配,而不仅仅是第一个匹配。偏移量将从1开始计算,而不是0。要使用substract 1 from the variable ${OFFSET},可以使用$((${OFFSET}-1))

例如,在系统二进制文件中搜索"string“ELF (HEX 454c46),如下所示

代码语言:javascript
运行
复制
./searchHEX.sh /bin/yes 454c46
7f454c460201010000000000000000000...01000000000000000000000000000000
Searching 454c46
2:/bin/yes
票数 3
EN

Stack Overflow用户

发布于 2020-05-03 18:33:33

我也会为此使用regex:

文本文件:

代码语言:javascript
运行
复制
$ cat tst.txt 
1234567890x1fgg0x1cfffrr

您可以轻松更改/扩展自己的脚本。

代码语言:javascript
运行
复制
#! /bin/bash
part="$(perl -0pe 's/^((?:(?!0(x|X)[0-9a-fA-F]+).)*)(0(x|X)[0-9a-fA-F]+)(.|\n)*/\1:\3\n/g;' tst.txt)"
tmp=${part/:0x*/}
tmp=${#tmp}
echo ${part/*:0x/$tmp:0x} # Echoes 123456789:0x1f

Regex:

代码语言:javascript
运行
复制
^((?:(?!0x[0-9a-fA-F]+).)*) = Search for the first entry that's a hexadecimal number and create a group of it (\1).

(0x[0-9a-fA-F]+) = Make a group of the hexadecimal number (\3).

(.|\n)* = Whatever follows.

请注意,如果在捕获的十六进制数字之前有类似于tmp=${part/:0x*/}的文本,那么:0x可能会造成问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61578057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档