我有一个原始格式的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
但我无法让它发挥作用。
有人可以给我一个提示吗?
答案 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的人可能会因为我真正生锈而改进。无论如何要考虑的方法。