Shell magic想要:在管道中格式化hexdump的输出

时间:2011-05-12 07:18:09

标签: perl shell formatting netcat hexdump

我正在调试通过TCP传输数据的程序的输出。 出于调试目的,我已使用netcathexdump

替换了接收程序
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 个答案:

答案 0 :(得分:3)

对于没有字符部分的hexdump。

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

答案 1 :(得分:3)

我用这个:

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是您想要的每个块中的字节数。

答案 2 :(得分:0)

您也可以使用xxd -p制作一个hexdump。