2010-03-30 8 views
3

У меня есть куча бинарных файлов, каждая из которых содержит встроенную строку рядом с концом файла, но в разных местах (происходит только один раз в каждом файле). Мне нужно извлечь часть файла, начиная с места строки до конца файла, и выгрузить его в новый файл.«хвостать» двоичный файл на основе расположения строк с помощью bash?

например. Если содержимое файла «AWREDEDEDEXXXERESSDSDS», а строка интереса - «XXX», то часть файла, в которой я нуждаюсь, - «XXXERESSDSDS».

Какой самый простой способ сделать это в bash?

ответ

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 строки -n4 --radix = d -fСписок всех строк в файле и их позиции и укажите имя файла на выходе

Grep «строка»Вывести строки, содержащие " строка "(это происходит только один раз в каждом файле)

awk '{sub (/: /," "); print $ 2 "" $ 1 "" $ 1 ".«;}»Удалить двоеточие после имени файла добавляется строками, и распечатать позицию строки, имя файла и имя файла с периодом (эта линия используется в качестве аргументов для раскола команды

xargs -l1 раскол -bВыполните команду раздельным для каждой строки с использованием выходного сигнала AWK, как и остальные аргументы

гт * .aaУдалить первые части расщепленных файлов. «аа "является суффиксом по умолчанию для части разделенных файлов.

Есть, вероятно, лучшие/быстрые/безопасные способы сделать это, но это хорошо для моих целей.

0

Будет strings и grep Вы хотите?

например.

strings -n 3 myfilename | grep XXX 
+0

Он возвращает только строку, а не следующий бит. Мне нужно все с начала строки до конца файла. – ilitirit

1

В PERL существует встроенная переменная, которая конкретно относится к части строки после согласованного регулярного выражения. Это будет метод, который я бы использовал. Это не просто Bash и утилиты, но PERL настолько часто устанавливается, что вы должны быть в порядке.

+0

Большинство текстовых утилит в стандартной командной строке unix обрабатывают двоичные данные плохо и/или неправильно, поскольку они делают предположения, такие как символы '\ 0' в файле. Вот почему у вас будет больше успеха, используя такую ​​программу, как Perl или Python, которая не имеет таких ограничений. – msw

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

Печать пустой строки в моей системе. – ilitirit

+0

Этот выход останавливается при следующем символе новой строки! – ypnos

+1

... 'awk '/ XXX/{gsub (/.* XXX /," "); p = 1} p {print}'' – vladr

1

Ниже приводится небольшое решение оболочки раковины, которое не очень эффективно. Но это работает.

Запись файла сценария 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

пс: извините забыл один вариант Grep в первом посте

+0

Дает мне эту ошибку: «dd: недопустимый номер». Кстати, это было в тестовом файле. Я позволил ему проработать несколько минут в файле 9mb, и он не завершился. – ilitirit

+0

Ну, как я уже сказал, это очень медленно. Возможно, это было еще медленнее для вас, так как grep не работал правильно. лучше повторите попытку. – ypnos

+0

Теперь он дает мне ошибку dd: неверный номер '\ r ' – ilitirit

-1

Попробуйте это:

grep -ao string.* filename 

Поскольку у вас есть двоичные данные, вы можете перенаправить вывод в файл.

grep -ao string.* filename > binary.out 

Или трубы через hexdump или аналогичные для тестирования:

grep -ao string.* filename | hd 
+0

Спасибо, он терпит неудачу, когда он нажимает символ новой строки. – ilitirit

+0

Этот выход останавливается при следующем символе новой строки! – ypnos