2012-05-08 4 views
0

Вот ситуация: Мне нужно найти на выходе из hexdump байты между строкой A и строкой B. Структура hexdump выглядит примерно так:«Grep-ing» от A до B в выводе hexdump

-random bytes 
-A + useful bytes + B 
-random bytes 
-A + useful bytes + B 
-random bytes 

И теперь, вопросы: - можно ли Grep "от А до Б"? Я не видел ничего подобного на странице руководства или в Интернете. Я знаю, что могу сделать это вручную, но мне нужно его скриптировать. - Возможно ли показать выход hexdump без номеров строк? Это кажется очень разумным, но я не нашел способ сделать это.

Спасибо!

ответ

0

grepпрограмма работает только по одной линии; вы не сможете заставить его работать разумно на шестнадцатеричном дампе.

мое предложение: используйте регулярные выражения в perl или ruby ​​или ваш любимый язык сценариев, чтобы grep необработанные двоичные данные для строки. Этот пример в рубине:

ARGF.read.force_encoding("BINARY").scan(/STR1(.*?)STR2/); 

Это будет производить массив, содержащий все двоичные строки между вхождениями STR1 и STR2. Оттуда вы можете запускать каждый через hexdump(1).

1

Вы можете использовать Perl-как lookaround assertions, чтобы соответствовать все между А и В, не включая А и В:

$ echo 'TEST test A foo bar B test' | grep -oP '(?<=A).*(?=B)' 
foo bar 

Однако, принимая во внимание Michael's answer, вы должны преобразовать hexdump выход к одна строка для использования grep. Вы можете сдирать «номера строк» ​​на вашем пути:

hexdump filename | sed -r 's/\S{5,}//g' | tr '\n' ' ' 

или лучше

hexdump filename | cut -d ' ' -f 2- | tr '\n' ' ' 

Сейчас все находится на одной линии, так grep должен быть ленивым, не жадный:

$ echo 'TEST test A foo bar B test A bar foo B test' | grep -oP '(?<=A).*?(?=B)' 
foo bar 
bar foo 

Но у Майкла есть точка, может быть, вы должны использовать что-то более высокоуровневое, по крайней мере, если вам нужно сделать это более одного раза.

P.S. Если вы в порядке с включением A и B в матче, просто сделайте

$ echo 'TEST test A foo bar B test A bar foo B test' | grep -oP 'A.*?B' 
A foo bar B 
A bar foo B 
Смежные вопросы