asは$ hexdump -C data
ファイルの16進数の内容を1行に16バイトで印刷します。
それでは、オプションを設定して、Ascii 0a(新しい行)が表示されるたびにどのように行を印刷できますか?
答え1
入力の各行(または0x2a()で区切られたレコード)の出力に16進ダンプ行が必要な場合は、実際にAビットを使用してこれを行うことはできませんが、*
Perlhexdump
でコーディングするのは比較的簡単です。
lhexdump() {
perl -ne '
printf "%08x %s |%s|\n",
$offset,
join(" ", unpack("(H2)*", $_)),
s/[^[:print:]]/./rg;
$offset = tell ARGV;
END{printf "%08x\n", $offset}' -- "$@"
}
8つのグループから16進数を分離する試みもなく、末尾のテキストセクションを並べ替える試みもなく、そのような重複をスキップする試みもありませんhexdump
。
$ printf 'a\xff1\n**\n\b' | lhexdump
00000000 61 ff 31 0a |a.1.|
00000004 2a 2a 0a |**.|
00000007 08 |.|
00000008
*
- 区切りレコードの場合、-052
オプションを追加しますperl
(8進数52は16進数0x2aです)。
それでも、各出力ラインを最大16バイトに制限します(出力をソートできます)。
lhexdump() {
perl -ne '
while ($_ ne "") {
my $chunk = substr($_, 0, 16);
$_ = substr($_, 16);
printf "%08x %-47s |%s|\n",
$offset,
join(" ", unpack("(H2)*", $chunk)),
$chunk =~ s/[^[:print:]]/./rg;
$offset += length($chunk);
}
END{printf "%08x\n", $offset}' -- "$@"
}
$ head -n4 /etc/passwd | lhexdump
00000000 72 6f 6f 74 3a 78 3a 30 3a 30 3a 72 6f 6f 74 3a |root:x:0:0:root:|
00000010 2f 72 6f 6f 74 3a 2f 62 69 6e 2f 62 61 73 68 0a |/root:/bin/bash.|
00000020 64 61 65 6d 6f 6e 3a 78 3a 31 3a 31 3a 64 61 65 |daemon:x:1:1:dae|
00000030 6d 6f 6e 3a 2f 75 73 72 2f 73 62 69 6e 3a 2f 75 |mon:/usr/sbin:/u|
00000040 73 72 2f 73 62 69 6e 2f 6e 6f 6c 6f 67 69 6e 0a |sr/sbin/nologin.|
00000050 62 69 6e 3a 78 3a 32 3a 32 3a 62 69 6e 3a 2f 62 |bin:x:2:2:bin:/b|
00000060 69 6e 3a 2f 75 73 72 2f 73 62 69 6e 2f 6e 6f 6c |in:/usr/sbin/nol|
00000070 6f 67 69 6e 0a |ogin.|
00000075 73 79 73 3a 78 3a 33 3a 33 3a 73 79 73 3a 2f 64 |sys:x:3:3:sys:/d|
00000085 65 76 3a 2f 75 73 72 2f 73 62 69 6e 2f 6e 6f 6c |ev:/usr/sbin/nol|
00000095 6f 67 69 6e 0a |ogin.|
0000009a
比較:
$ head -n4 /etc/passwd | hexdump -C
00000000 72 6f 6f 74 3a 78 3a 30 3a 30 3a 72 6f 6f 74 3a |root:x:0:0:root:|
00000010 2f 72 6f 6f 74 3a 2f 62 69 6e 2f 62 61 73 68 0a |/root:/bin/bash.|
00000020 64 61 65 6d 6f 6e 3a 78 3a 31 3a 31 3a 64 61 65 |daemon:x:1:1:dae|
00000030 6d 6f 6e 3a 2f 75 73 72 2f 73 62 69 6e 3a 2f 75 |mon:/usr/sbin:/u|
00000040 73 72 2f 73 62 69 6e 2f 6e 6f 6c 6f 67 69 6e 0a |sr/sbin/nologin.|
00000050 62 69 6e 3a 78 3a 32 3a 32 3a 62 69 6e 3a 2f 62 |bin:x:2:2:bin:/b|
00000060 69 6e 3a 2f 75 73 72 2f 73 62 69 6e 2f 6e 6f 6c |in:/usr/sbin/nol|
00000070 6f 67 69 6e 0a 73 79 73 3a 78 3a 33 3a 33 3a 73 |ogin.sys:x:3:3:s|
00000080 79 73 3a 2f 64 65 76 3a 2f 75 73 72 2f 73 62 69 |ys:/dev:/usr/sbi|
00000090 6e 2f 6e 6f 6c 6f 67 69 6e 0a |n/nologin.|
0000009a
答え2
見ているマニュアルページ、hexdump
条件付きで1行を印刷するオプションはありません。
含まれている行を印刷したいとし、2a
次を使用しますgrep
。
hexdump -C data | grep 2a