Linux 在文件中查找十六进制值并grep以下值

Linux 在文件中查找十六进制值并grep以下值,linux,bash,grep,hex,cut,Linux,Bash,Grep,Hex,Cut,我有一个2GB的原始格式文件。我想搜索特定十六进制值“355A3C2F74696D653E”的所有外观,并收集以下28个字符 示例:355A3C2F74696D653E323031312D30342D32365431343A34373A330322D31343A34373A3135 在这种情况下,我想要输出:“323031312D30342D32365431343A34373A330322D31343A34373A3A3A3135”或更好:2011-04-26T14:47:02-14:47:15

我有一个2GB的原始格式文件。我想搜索特定十六进制值“355A3C2F74696D653E”的所有外观,并收集以下28个字符

示例:
355A3C2F74696D653E323031312D30342D32365431343A34373A330322D31343A34373A3135

在这种情况下,我想要输出:
“323031312D30342D32365431343A34373A330322D31343A34373A3A3A3135”
或更好:
2011-04-26T14:47:02-14:47:15

我试过了

xxd -u InputFile | grep '355A3C2F74696D653E' | cut -c 1-28 > OutputFile.txt

但我不能让它工作


有人能给我一个提示吗?

如果您的grep支持
-p
参数,那么您可以简单地使用下面的命令

$ echo '355A3C2F74696D653E323031312D30342D32365431343A34373A30322D31343A34373A3135' | grep -oP '355A3C2F74696D653E\K.{28}'
323031312D30342D32365431343A
56个字符

$ echo '355A3C2F74696D653E323031312D30342D32365431343A34373A30322D31343A34373A3135' | grep -oP '355A3C2F74696D653E\K.{56}'
323031312D30342D32365431343A34373A30322D31343A34373A3135

当您使用
xxd
时,我觉得您希望像搜索二进制数据一样搜索文件。我建议为此使用更强大的编程语言;unixshell工具假定有行尾,并且文本大部分是7位ASCII。考虑使用Python:

#!/usr/bin/python
import mmap
fd = open("file_to_search", "rb")
needle = "\x35\x5A\x3C\x2F\x74\x69\x6D\x65\x3E"
haystack = mmap.mmap(fd.fileno(), length = 0, access = mmap.ACCESS_READ)
i = haystack.find(needle)
while i >= 0:
    i += len(needle)
    print (haystack[i : i + 28])
    i = haystack.find(needle, i)

为什么先转换成十六进制?看看这个awk脚本是否适合您。它查找要匹配的字符串,然后打印接下来的28个字符。特殊字符在模式中用反斜杠转义

改编自本帖:

为了便于阅读,我添加了一些空行

VirtualBox:~$ cat data.dat

Thisis a test of somerandom characters before thestringI want5Z</time>2011-04-26T14:47:02-14:47:15plus somemoredata

VirtualBox:~$ cat test.sh

awk '/5Z\<\/time\>/ {
  match($0, /5Z\<\/time\>/); print substr($0, RSTART + 9, 28);
}' data.dat

VirtualBox:~$ ./test.sh

2011-04-26T14:47:02-14:47:15

VirtualBox:~$ 
VirtualBox:~$cat data.dat
这是对字符串want5Z2011-04-26T14:47:02-14:47:15之前的一些随机字符以及更多数据的测试
VirtualBox:~$cat test.sh
awk'/5Z\/{
匹配($0,/5Z\/);打印子字符串($0,RSTART+9,28);
}'data.dat
VirtualBox:~$./test.sh
2011-04-26T14:47:02-14:47:15
虚拟箱:~$

编辑:我刚刚意识到一些事情。正则表达式将需要调整为非贪婪的,等等,在这和awk之间需要调整以处理您需要的多次出现。也许一些更了解awk的人可以加入到改进中来,因为我实在是太生疏了。无论如何要考虑的一种方法。

但是你预期的输出有28以上的字符。你的尝试以哪种方式失败了?他们的输出和期望的输出有什么区别?嗨,我发布的命令得到的结果与你建议的非常相似,但它给出了一个我无法使用的结果,十六进制和纯文本的混合:5432 303A 3237 2011-04-2 5432 303A e>2011-04-26T2 5432 303A 3239 2011-04-2 5432 303A e>2011-04-26T2 5432 303A 3333 2011-04-2 5432 303A e>2011-04-26T2 5432 303A 3530 2011-04-2这里是7行,(我不知道如何进行换行…:-/)接受一个答案,并将其作为一个新问题提问。嗨,我对python没有太多经验,只尝试了一点脚本,但假设我只需要将命令行复制/粘贴到一个空记事本文档中,将其另存为例如Pinele,然后在terminal中键入bash Pinele来运行它??当我这样做时,它会显示:指针:第2行:导入:未找到命令指针:第3行:意外标记附近的语法错误
('pineel:line 3:
fd=open(“InputFileName”,“rb”)'我已将脚本放置在与InputFile相同的文件夹中。我做错了什么?请注意,python解释器没有运行hdkIt。请将文件另存为
script.py
,然后在Bash中运行
python script.py
。您好,现在它可以工作了:-)非常感谢。我还尝试将输出写入一个文件:writeFile=open('Time.txt','w'),并在while循环中写入:writeFile.write(haystack[I:I+28])。它可以正常工作,但我希望每次迭代一行,输出一行长的文本。我已尝试使用writeline和writelines,但它不会更改输出。请使用
writeFile.write(“\n”)
插入新行。嗨,杰克,谢谢你,现在它工作正常了。我是stackoverflow的新手,我是否可以将您的答案标记为有帮助或竖起大拇指。。。??向hdk致意。
VirtualBox:~$ cat data.dat

Thisis a test of somerandom characters before thestringI want5Z</time>2011-04-26T14:47:02-14:47:15plus somemoredata

VirtualBox:~$ cat test.sh

awk '/5Z\<\/time\>/ {
  match($0, /5Z\<\/time\>/); print substr($0, RSTART + 9, 28);
}' data.dat

VirtualBox:~$ ./test.sh

2011-04-26T14:47:02-14:47:15

VirtualBox:~$