Требуется волшебство оболочки: форматировать вывод hexdump в трубе - PullRequest
3 голосов
/ 12 мая 2011

Я отлаживаю вывод программы, которая передает данные по TCP. В целях отладки я заменил принимающую программу на netcat и hexdump:

netcat -l -p 1234 | hexdump -C

Это выводит все данные в виде хорошего hexdump, почти как я хочу. Теперь данные передаются в фиксированных блоках, длина которых не кратна 16, что приводит к смещенным линиям на выходе, что затрудняет определение различий:

00000000  50 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |P...............|
00000010  00 50 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |.P..............|
00000020  00 00 50 00 00 00 00 00  00 00 00 00 00 00 00 00  |..P.............|

Как переформатировать вывод, чтобы после 17 байтов начиналась новая строка? Это должно выглядеть примерно так:

50 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |P...............|
00                                                |.               |
50 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |P...............|
00                                                |.               |
50 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |P...............|
00                                                |.               |

Использование hexdumps -n параметр не работает, так как он выйдет после достижения количества байтов. (Если нет способа сохранить работающую программу netcat и беспрепятственно передавать следующие байты новому экземпляру hexdump).

Также было бы здорово, если бы я мог использовать watch -d на выходе, чтобы получить подсветку изменений между строками.

Ответы [ 3 ]

3 голосов
/ 12 мая 2011

Я использую это:

use strict;
use warnings;
use bytes;

my $N = $ARGV[0];

$/ = \$N;

while (<STDIN>) {
    my @bytes = unpack("C*", $_);
    my $clean = $_;
    $clean =~ s/[[:^print:]]/./g;
    print join(' ', map {sprintf("%2x", $_)} @bytes),
    "  |", $clean, "|\n";
}

Запустите его как perl scriptname.pl N, где N - количество байтов в каждом блоке, который вы хотите.

3 голосов
/ 12 мая 2011

Для hexdump без символов.

hexdump -e '16/1 "%0.2x " "\n" 1/1 "%0.2x " "\n"'

1 голос
/ 24 июня 2013

также вы можете использовать xxd -p для создания hexdump.

...