在文件中查找HEX值并grep以下值

时间:2015-04-30 16:00:04

标签: linux bash grep hex cut

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

示例:355A3C2F74696D653E323031312D30342D32365431343A34373A30322D31343A34373A3135

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

我试过

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

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

但我无法让它发挥作用。

有人可以给我一个提示吗?

2 个答案:

答案 0 :(得分:0)

当您使用xxd时,在我看来,您希望将文件搜索为二进制数据。我建议使用更强大的编程语言; Unix shell工具假设有行结尾,文本主要是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)

答案 1 :(得分:0)

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

改编自这篇文章:Grep characters before and after match?

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

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:~$ 
编辑:我刚刚意识到了什么。正则表达式需要调整为非贪婪等,并且需要调整它和awk之间以根据需要调整多次出现。也许一些更多关于awk的人可能会因为我真正生锈而改进。无论如何要考虑的方法。