Suponha que queiramos um byte minimalista por linhaASCIIdespejo hexadecimal. SobLinuxusandoGNU od
, isso funciona:
echo foo | od -An -tx1 -w1 -v
Saída:
66
6f
6f
0a
Mas isso não vai funcionar comBSDderivados, porque oBSD od
util tem sinalizadores diferentes.
Qual é o mais portátil*nixmétodo? Caso contrário, quais são os melhores métodos disponíveis?
Responder1
od
é um comando padrão. Em od -An -tx1 -w1 -v
, a única coisa que não é POSIX é a -w
opção.
Você pode substituí-lo por:
od -An -vtx1 | LC_ALL=C tr -cs '0-9a-fA-F' '[\n*]' | grep .
O que funcionaria em qualquer sistema compatível com POSIX e funciona pelo menos no FreeBSD:
$ echo test | od -An -vtx1 | LC_ALL=C tr -cs 0-9a-fA-F '[\n*]' | grep .
74
65
73
74
0a
Ou com uma sed
invocação para substituir o tr
+ grep
:
od -An -vtx1 | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//;/./!d
s/[[:blank:]]\{1,\}/\
/g'
(ou
od -An -vtx1 | sed -n 's/[[:blank:]]*\([^[:blank:]]\{2\}\)[[:blank:]]*/\1\
/g;s/\n$//p'
)
Com perl
(não é um comando POSIX, mas é onipresente em qualquer coisa, exceto em sistemas embarcados):
perl -ne '
BEGIN{$/ = \8192; $, = $\ = "\n"}
print unpack "(H2)*", $_'
Que também é o mais rápido dos 3 em meus testes (em comparação com GNU od
) por uma margem significativa para qualquer coisa, exceto arquivos pequenos (também que hexdump
, não que vim
) xxd
.
Responder2
Talvez hexdump
:
$ echo foo | hexdump -v -e '1/1 "%02x\n"'
66
6f
6f
0a
Que é original do BSDseu manual está aqui (em BSD).
Porém o exemplo mostrado acima foi executado em Linux.