使用bash“拖尾”基于字符串位置的二进制文件?

时间:2010-03-30 14:11:27

标签: bash tail string-search

我有一堆二进制文件,每个文件都包含一个嵌入在文件末尾附近但在不同位置的字符串(每个文件只出现一次)。我需要从字符串的位置开始提取文件的一部分,直到文件末尾并将其转储到新文件中。

例如。如果文件的内容是“AWREDEDEDEXXXERESSDSDS”并且感兴趣的字符串是“XXX”,那么我需要的文件部分是“XXXERESSDSDS”。

在bash中最简单的方法是什么?

6 个答案:

答案 0 :(得分:1)

在PERL中,内置一个变量,专门指匹配正则表达式后的字符串部分。这将是我将使用的方法。它不只是Bash和实用程序,但PERL是如此常见的安装,你应该没问题。

答案 1 :(得分:1)

以下是一个不太高效的小型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

p.s。抱歉忘记了第一篇文章中的grep选项

答案 2 :(得分:0)

您想要stringsgrep吗?

e.g。

strings -n 3 myfilename | grep XXX

答案 3 :(得分:0)

 strings -n3 file_binary | awk '/XXX/{gsub(/.*XXX/,"");print}'

答案 4 :(得分:0)

我提出了这个解决方案:

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“。”;}' 在字符串添加文件名后删除冒号,并用句点打印字符串,文件名和文件名的位置(这line用作split命令的参数

xargs -l1 split -b 使用awk的输出作为其余参数执行每行的split命令

rm * .aa 删除拆分文件的第一部分。 “aa”是拆分文件部分的默认后缀。

可能有更好/更快/更安全的方法,但这对我的目的来说很好。

答案 5 :(得分:-1)

试试这个:

grep -ao string.* filename

由于您有二进制数据,您可能希望将输出重定向到文件。

grep -ao string.* filename > binary.out

或通过hexdump或类似方法将其传播以进行测试:

grep -ao string.* filename | hd