Sort IP Addresses with GNU sort

Paul Heinlein

Initial publication: July 30, 2004
Most recent revision: August 3, 2004

How to sort IP addresses using the GNU sort utility.

The short answer. Here’s the invocation that works. It’s explained in the long answer that follows.

sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4

The long answer. More than once I’ve been confronted with a list of IP addresses that I’ve wanted to sort into numeric order. Trouble is, the dotted-quad notation isn’t sort-friendly. Consider the following raw list of addresses.

$ cat addresses.txt

Without options, sort will rely on alphabetic order, which certainly won’t do what you want:

$ sort addresses.txt

There are so many mistakes in this ordering I’m not even going to try to list them all.

The situation is only marginally improved when using the --numeric-sort (-n) option.

$ sort -n addresses.txt

The first set of numbers in each dotted-quad sort correctly—5 preceeds 19, and 129 is at the tail end—but the internal numbering still gets improper treatment. is listed prior to because 220 is alphabetically prior to 24. Likewise the two 19.20.x.x addresses are mixed up because 203 is alphabetically prior to 21.

The solution is to tell sort to order the list numerically, considering each address as a set of four numeric fields, each separated by a dot.

$ sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 addresses.txt

In English, you’re saying, Yo, sort! I’ve got here a list of numbers (-n), but each item in the list consists of some subnumbers, fields set apart from the others by a dot (-t .). Sort first by the first field, and only the first field (-k 1,1), then by the second and only the second (-k 2,2), and so on (-k 3,3 -k 4,4).

This article is licensed under a Creative Commons License.

Return to Technical Writings

Home - Blog - Tech - Praise - Paul - Books - About

printer-friendly layout