od

od — short for "octal dump" — prints the raw bytes of a file. Where cat shows you a file as text, od shows you the actual bytes underneath: each one rendered as a number, a character, or a floating-point value, in whatever base you ask for. It is the tool for looking at binary files, checking exactly which bytes a text file contains, or finding a stray control character that isn't visible on screen.

od [options] [file...]
$ od hello.txt
0000000 062510 066154 020157 067527 066162 020144 000012
0000015

With no file — or with the name -od reads standard input, so it can sit at the end of a pipeline. Given several files, it reads them one after another as a single continuous stream, and the byte offsets run straight through from one file into the next.

How the output is laid out #

Every line of output has two parts:

  • An offset on the left: the position, counted in bytes from the start of the input, of the first byte on that line. By default it is printed in octal (see -A to change the base).
  • One or more format columns on the right: the bytes of that line rendered in the format(s) you chose.

With no format option, od prints the input as octal, two bytes at a time — the traditional default. The very last line of output is a lone offset marking the total length of the input.

If you ask for more than one format at once, each format is printed on its own line, stacked under a single shared offset. Only the first line of the group carries the offset; the rest are indented to line up beneath it.

Choosing what the bytes look like #

There are two ways to say how bytes should be rendered: a set of single-letter named shortcuts for the common cases, and the general -t / --format option for full control. You can give several at once, and they are applied in the order they appear on the command line.

Named format shortcuts #

Each of these selects one output format. Combine them freely (od -cx prints characters and hex together).

OptionRenders each unit as
-aNamed characters, ignoring the high-order bit (control characters shown by name, e.g. nul, sp, del).
-bOctal, one byte at a time.
-cPrintable ASCII / UTF-8 characters, with backslash escapes (\n, \t, …) for the rest.
-dUnsigned decimal, 2-byte units.
-DUnsigned decimal, 4-byte units.
-oOctal, 2-byte units.
-OOctal, 4-byte units.
-sSigned decimal, 2-byte units.
-iSigned decimal, 4-byte units.
-lSigned decimal, 8-byte units.
-I, -LSigned decimal, 8-byte units.
-x, -hHexadecimal, 2-byte units.
-X, -HHexadecimal, 4-byte units.
-fFloating point, single precision (32-bit).
-e, -FFloating point, double precision (64-bit).

Type specifications (-t, --format) #

-t takes a type specification and gives you every combination the named shortcuts cover and more. Repeat -t (or list several specs in one argument) to print multiple formats.

A type specification is a type letter, an optional size, and an optional z suffix:

Type letterMeaning
aPrintable 7-bit ASCII, named (like -a).
cUTF-8 characters, with octal escapes for undefined bytes (like -c).
dSigned decimal.
uUnsigned decimal.
oOctal.
xHexadecimal.
fFloating point.

For the numeric types (d, u, o, x, f) a size says how many bytes make up one unit. It can be a number, or a letter:

SizeApplies toBytes per unit
1 / Cinteger types1
2 / Sinteger types2
4 / Iinteger types4
8 / Linteger types8
4 / Ffloating point4 (single precision)
8 / Dfloating point8 (double precision)
16 / Lfloating point16 (extended / long double)
2 / Hfloating point2 (IEEE half precision)
2 / Bfloating point2 (bfloat16)

If you leave the size off, integer types default to 4 bytes and floating point defaults to 8 bytes. For the character types a and c, a size is not allowed.

Add a z at the end of a spec to append an ASCII dump — the bytes of that line shown as text, . for anything non-printable — to the right of the numbers. For example, od -t x1z gives the familiar hex-plus-text layout:

$ od -A x -t x1z file.bin
000000 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 0a           >Hello, world!.<

Examples: od -t d2 is signed decimal in 2-byte units; od -t x1 is hex byte-by-byte; od -t fD is double-precision floats; od -t c is characters. od -t x1 -t c prints hex and characters as two stacked lines.

Byte order (--endian) #

For multi-byte numeric formats, --endian sets the byte order used to assemble each unit. Without it, od uses the machine's native byte order. Use --endian=big or --endian=little to force one regardless of the host.

The offset column #

OptionEffect
-A RADIX, --address-radix=RADIXPrint offsets in the given base. RADIX is one of o (octal, the default), d (decimal), x (hexadecimal), or n (none — omit the offset column entirely).

Only the first character of the value is examined, so od -A n and od -Anone mean the same thing.

Which bytes to read #

By default od dumps the whole input. Two options narrow that to a window:

OptionEffect
-j BYTES, --skip-bytes=BYTESSkip BYTES bytes of input before starting to dump. When several files are given, the skip runs across the concatenated stream.
-N BYTES, --read-bytes=BYTESDump at most BYTES bytes, then stop.

In both, BYTES is decimal by default, octal if it starts with 0, or hexadecimal if it starts with 0x. A suffix scales it: b = ×512, KB/K = ×1000 / ×1024, MB/M = ×1000² / ×1024², GB/G = ×1000³ / ×1024³.

Collapsing repeated lines #

When several output lines in a row would be identical, od prints the first one, then a single line containing just * to stand for the run, and resumes at the next line that differs. This keeps a dump of a large block of identical bytes (a file full of zeros, say) short.

OptionEffect
-v, --output-duplicatesTurn the collapsing off — print every line, including repeats, with no * markers.

Output width #

OptionEffect
-w[BYTES], --width[=BYTES]Print BYTES input bytes per output line. The default is 16; giving -w with no value uses 32.

The width must be a whole multiple of the size of the largest format unit in play; if it isn't, od warns and rounds it to a usable value.

Finding printable strings #

OptionEffect
-S[BYTES], --strings[=BYTES]Instead of dumping bytes, scan the input and print only runs of at least BYTES printable characters, one per line, each preceded by its offset. BYTES defaults to 3 when omitted.

This turns od into a quick way to pull the human-readable text out of a binary file. The offset in front of each string honours -A (and is dropped entirely under -A n). -j and -N still apply, so you can restrict the scan to a window.

The traditional offset form #

od also accepts the historical calling convention, where an offset (and, in --traditional mode, a label) is given as a bare operand rather than an option:

od [named-format-options] [file] [[+]offset[.][b]]
od --traditional [options] [file] [[+]offset[.][b] [[+]label[.][b]]]

The offset says where in the input to begin, exactly like -j. It is read as octal by default, hexadecimal if prefixed with 0x, or decimal if it carries a trailing .; a trailing b multiplies it by 512. The optional leading + is allowed everywhere and is required when there is no filename (so od +20 reads standard input starting at octal offset 20).

The label (only in --traditional mode) is a second such number: the dump still begins at offset, but the offset column is displayed as if it started at label — useful for making a partial dump's offsets match the original file.

od only reads an operand as an offset in the plain form when none of -A, -j, -N, -t, -v, or -w are present. So if a real filename happens to look like a number, add a harmless option such as -j0 to force it to be treated as a filename.

A note on reading files #

od has no access rules of its own — it simply opens a file and reads its bytes. That read is subject to the same check as every read on Peios: whether you may open the file for reading is decided by the file's security descriptor (see Security descriptors). od never reveals bytes you could not already read another way; it only presents the bytes you can read in a different form.

Exit status #

CodeMeaning
0The input was dumped successfully.
1A file could not be read, or an option, format, or offset was invalid.

Edit this page