"Grep-ing" от A до B в выводе hexdump
Вот ситуация: я должен найти в выводе из hexdump
байты между строкой A и строкой B. Структура hexdump выглядит примерно так:
-random bytes
-A + useful bytes + B
-random bytes
-A + useful bytes + B
-random bytes
А теперь вопросы: - Возможно ли grep "от А до Б"? Я не видел ничего подобного на странице руководства или в Интернете. Я знаю, что могу сделать это вручную, но мне нужно написать скрипт. - Можно ли показать вывод hexdump без номеров строк? Это кажется очень разумным, но я не нашел способ сделать это.
Спасибо!
2 ответа
Вы можете использовать Perl-подобные обходные утверждения для сопоставления всего между A и B, не считая A и B:
$ echo 'TEST test A foo bar B test' | grep -oP '(?<=A).*(?=B)'
foo bar
Однако, принимая во внимание ответ Майкла, вам придется преобразовать 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
Но у Майкла есть смысл, может быть, вам стоит использовать что-то более высокого уровня, по крайней мере, если вам нужно сделать это более одного раза.
PS Если вы в порядке с включением 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
grep
программа работает только на одной строке одновременно; вы не сможете заставить его работать разумно на шестнадцатеричном дампе.
Мое предложение: используйте функцию регулярного выражения в perl или ruby или на вашем любимом языке сценариев, чтобы получить необработанные двоичные данные для строки. Этот пример в ruby:
ARGF.read.force_encoding("BINARY").scan(/STR1(.*?)STR2/);
Это создаст массив, содержащий все двоичные строки между вхождениями STR1 и STR2. Оттуда вы можете запустить каждый hexdump(1)
,