How To Find All IP Addresses within a File in Linux with grep


TL;DR

# Get all IPv4 addresses
grep -xE "([0-9]{1,3}\.){3}[0-9]{1,3}" file.txt
# Get only valid IPv4 addresses
grep -xE "((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])" file.txt
# Get IPv4 addresses given first 2 numbers (i.e. 999.998.x.x)
grep -xE "(999\.998)(\.[0-9]{1,3}){2}" file.txt

Let’s figure out how this works.

First, we need a regular expression that can match all IPv4 addresses.

Regular Expression to Match IPs

This regular expression will match all expressions from 0.0.0.0 to 999.999.999.999.

([0-9]{1,3}[\.]){3}[0-9]{1,3}

[0-9] looks for all expressions containing a number 0-9.

{1,3} tells us that the preceding expression needs to occur between 1 and 3 times, inclusive (so we want either 1, 2, or 3 consecutive numbers).

[\.] searches for a literal period.

Together, ([0-9]{1,3}[\.]) can find the first number in the IP address (e.g. 0. or 999.).

{3} tells us that we want exactly three occurrences of the previous expression.

Therefore, the expression ([0-9]{1,3}[\.]){3} will give us the first three numbers in the IP address: 0.0.0. or 999.999.999..

[0-9]{1,3} is a manual addition of the fourth number, completing the IP address.

Match All IPs

Any command below will work to print the entire line containing the IP address. Add the -o flag to print just the IP address.

grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" file.txt
egrep "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" file.txt

\b is a word boundary. It signifies the beginning or end of a word. In our case, the IP address can either be at the beginning of the line, at the end of the line, or in between non-word characters, such as spaces.

grep -E and egrep refer to “extended” regular expressions, which change the meaning of ?, +, {, |, (, and ). To match for match a literal { using extended regex, we can use [{] instead.

grep -xE "([0-9]{1,3}\.){3}[0-9]{1,3}" file.txt

-x selects only matches that exactly match the whole line. We can remove the \b in this scenario.

Match Only Valid IPs

We can use the expression below with a completely correct regular expression.

grep -xE "((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])" file.txt

Match IPs Knowing Part of the IP

Suppose I know the first number in my IP address is 999.x.x.x.

grep -xE "(999)(\.[0-9]{1,3}){3}" file.txt

What if the first two numbers are 999.998.x.x?

grep -xE "(999\.998)(\.[0-9]{1,3}){2}" file.txt

What if the first three are 999.998.997.x?

grep -xE "999\.998\.997\.[0-9]{1,3}" file.txt