How do I create an unmodified hex dump of a binary file in Linux using bash? The od
and hexdump
commands both insert spaces in the dump and this is not ideal.
Is there a way to simply write a long string with all the hex characters, minus spaces or newlines in the output?
I think this is the most widely supported version (requiring only POSIX defined tr
and od
behavior):
cat "$file" | od -v -t x1 -A n | tr -d ' \n'
This uses od
to print each byte as hex without address without skipping repeated bytes and tr
to delete all spaces and linefeeds in the output. Note that not even the trailing linefeed is emitted here. (The cat
is intentional to allow multicore processing where cat
can wait for filesystem while od
is still processing previously read part. Single core users may want replace that with < "$file" od ...
to save starting one additional process.)
It seems to depend on the details of the version of od
. On OSX, use this:
od -t x1 -An file |tr -d '\n '
(That's print as type hex bytes, with no address. And whitespace deleted afterwards, of course.)
Format strings can make hexdump behave exactly as you want it to (no whitespace at all, byte by byte):
hexdump -ve '1/1 "%.2x"'
1/1
means "each format is applied once and takes one byte", and "%.2x"
is the actual format string, like in printf. In this case: 2-character hexadecimal number, leading zeros if shorter.
$ od -t x1 -A n -v <empty.zip | tr -dc '[:xdigit:]' && echo
504b0506000000000000000000000000000000000000
$
Use the od
tool to print single hexadecimal bytes (-t x1
) --- without address offsets (-A n
) and without eliding repeated "groups" (-v)
--- from empty.zip
, which has been redirected to standard input. Pipe that to tr
which deletes (-d
) the complement (-c
) of the hexadecimal character set ('[:xdigit:]'
). You can optionally print a trailing newline (echo
) as I've done here to separate the output from the next shell prompt.
The other answers are preferable, but for a pure Bash solution, I've modified the script in my answer here to be able to output a continuous stream of hex characters representing the contents of a file. (Its normal mode is to emulate hexdump -C
.)
xxd -p file
Or if you want it all on a single line:
xxd -p file | tr -d '\n'
Perl one-liner:
perl -e 'local $/; print unpack "H*", <>' file
Source: Stackoverflow.com