我有一堆二进制文件,每个文件都在文件末尾附近包含一个嵌入的字符串,但在不同的位置(每个文件中只出现一次)。我需要提取从字符串位置开始直到文件末尾的文件部分并将其转储到一个新文件中。
例如。如果文件的内容是“AWREDEDEDEXXXERESSDSDS”并且感兴趣的字符串是“XXX”,那么我需要的文件部分是“XXXERESSDSDS”。
在 bash 中执行此操作的最简单方法是什么?
我有一堆二进制文件,每个文件都在文件末尾附近包含一个嵌入的字符串,但在不同的位置(每个文件中只出现一次)。我需要提取从字符串位置开始直到文件末尾的文件部分并将其转储到一个新文件中。
例如。如果文件的内容是“AWREDEDEDEXXXERESSDSDS”并且感兴趣的字符串是“XXX”,那么我需要的文件部分是“XXXERESSDSDS”。
在 bash 中执行此操作的最简单方法是什么?
在 PERL 中,内置了一个变量,专门引用匹配的正则表达式之后的字符串部分。那将是我将使用的方法。不仅是 Bash 和实用程序,而且 PERL 安装得非常普遍,您应该没问题。
以下是一个性能不高的小型 hack shell 解决方案。但它有效。
编写脚本文件tail.sh
如下:
#!/bin/sh
dd bs=1 if=$1 of=$2 skip=`grep --binary-files=text -m1 -b -o $3 $1 | cut -d ':' -f 1 | head -1`
调用tail.sh INPUTNAME OUTPUTNAME PATTERN
ps:很抱歉在第一篇文章中忘记了一个 grep 选项
你strings
愿意grep
吗?
例如
strings -n 3 myfilename | grep XXX
strings -n3 file_binary | awk '/XXX/{gsub(/.*XXX/,"");print}'
我想出了这个解决方案:
ls -1 *.bin | xargs strings -n4 --radix=d -f | grep "string" | awk '{sub(/:/, ""); print $2 " " $1 " " $1".";}' | xargs -l1 split -b && rm *.aa
ls -1 *.bin 仅以列表格式打印扩展名为“bin”的文件名
xargs strings -n4 --radix=d -f 列出文件中的所有字符串及其位置,并在输出中包含文件名
grep "string" 打印包含 "string" 的行(它在每个文件中只出现一次)
awk '{sub(/:/, ""); print $2 " " $1 " " $1".";}' 去掉字符串添加的文件名后面的冒号,打印字符串的位置、文件名、文件名加句点(该行作为参数拆分命令
xargs -l1 split -b 使用 awk 的输出作为其余参数为每一行执行 split 命令
rm *.aa 删除分割文件的第一部分。“aa”是分割文件部分的默认后缀。
可能有更好/更快/更安全的方法来做到这一点,但这对我来说很好。
试试这个:
grep -ao string.* filename
由于您有二进制数据,您可能希望将输出重定向到文件。
grep -ao string.* filename > binary.out
或通过管道hexdump
或类似管道进行测试:
grep -ao string.* filename | hd