假设我们想要每行一个极简的一个字节ASCII码十六进制转储。在下面Linux使用GNU od
,这有效:
echo foo | od -An -tx1 -w1 -v
输出:
66
6f
6f
0a
但这不起作用BSD衍生品,因为BSD od
util 有不同的标志。
什么东西最便携*尼克斯方法?如果做不到这一点,最好的可用方法是什么?
答案1
od
是一个标准命令。在 中od -An -tx1 -w1 -v
,唯一不是 POSIX 的是-w
选项。
您可以将其替换为:
od -An -vtx1 | LC_ALL=C tr -cs '0-9a-fA-F' '[\n*]' | grep .
它可以在任何 POSIX 兼容的系统中工作,并且至少在 FreeBSD 上工作:
$ echo test | od -An -vtx1 | LC_ALL=C tr -cs 0-9a-fA-F '[\n*]' | grep .
74
65
73
74
0a
或者通过一次sed
调用来替换tr
+ grep
:
od -An -vtx1 | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//;/./!d
s/[[:blank:]]\{1,\}/\
/g'
(或者
od -An -vtx1 | sed -n 's/[[:blank:]]*\([^[:blank:]]\{2\}\)[[:blank:]]*/\1\
/g;s/\n$//p'
)
使用perl
(不是 POSIX 命令,但在除嵌入式系统之外的任何系统上都普遍存在):
perl -ne '
BEGIN{$/ = \8192; $, = $\ = "\n"}
print unpack "(H2)*", $_'
在我的测试中,这也是 3 个中最快的(与 GNU 相比od
),除了小文件(也不hexdump
是vim
's xxd
)之外,它的速度有很大优势。
答案2
或许hexdump
:
$ echo foo | hexdump -v -e '1/1 "%02x\n"'
66
6f
6f
0a
这是来自 BSD 的原始版本它的手册在这里(BSD 版本)。
然而,上面显示的示例是在 Linux 中运行的。