user3063045
user3063045

Reputation: 2199

Bash Replace Variable IP Address with Network

I have an IP address set in a variable that I'd like to convert into a network address.

This only works for a single digit:

echo '192.168.1.2' | sed 's/.$/0/'  => 192.168.1.0
echo '192.168.1.22' | sed 's/.$/0/'  => 192.168.1.20
echo '192.168.1.223' | sed 's/.$/0/'  => 192.168.1.220

I need a method to return the same network value if the last digit(s) change, i.e:

myip="192.168.1.2"   => "192.168.1.0"
myip="192.168.1.22"  => "192.168.1.0"
myip="192.168.1.223" => "192.168.1.0"

How can I replace any IP address with it's network address like above?

Upvotes: 2

Views: 1359

Answers (4)

anishsane
anishsane

Reputation: 20970

Using sed

echo '192.168.1.2' | sed 's/\.[^.]*$/.0/'
sed 's/\.[^.]*$/.0/' <<< 192.168.1.22 # echo + pipe is not needed here

Logic: Replace everything from last . till end with .0

Using awk

awk -F. '{$NF=0}1' OFS=. <<< 192.168.1.22
awk '{$NF=0}1' FS=. OFS=. <<< 192.168.1.22

Logic: Split string with . and set last field to 0.

pure bash:

{ IFS=. read a b c _; echo $a.$b.$c.0; } <<< 192.168.1.22
( IFS=.; read -a ip; ip[3]=0; echo "${ip[*]}"; ) <<< 192.168.1.22

Logic: Read 4 parts of the IP address in 4 variables. Print first 3 and a 0. Or by using a bash array, if you don't want to clutter environment with too many variables.

Upvotes: 5

mauro
mauro

Reputation: 5940

Pure bash solution without external commands:

echo "${myip%.*}.0"

for example:

$ echo "$myip"
192.168.1.22
$ echo "${myip%.*}.0"
192.168.1.0

Upvotes: 6

user8017719
user8017719

Reputation:

It is very simple to do with pure bash:

myip="192.168.1.2  ";  echo "$myip ==> ${myip%.*}.0"
myip="192.168.1.22 ";  echo "$myip ==> ${myip%.*}.0"
myip="192.168.1.223";  echo "$myip ==> ${myip%.*}.0"

Results in:

192.168.1.2   ==> 192.168.1.0
192.168.1.22  ==> 192.168.1.0
192.168.1.223 ==> 192.168.1.0

However, that is assuming the network has a CDIR of 24 (192.168.1.2/24).

If that is not what you will always use, this idea will break.

Upvotes: 0

paxdiablo
paxdiablo

Reputation: 881093

You can do this with awk using:

pax> awk -F. '{print $1"."$2"."$3".0"}' <<<12.34.56.78
12.34.56.0

With sed, it's possible to just replace all the digits at the end:

pax sed 's/[0-9]*$/0/' <<<12.34.56.78
12.34.56.0

However, all of those result in an extra process being started up, not something you need to worry about for a few IP addresses but it will make a difference if you're converting many of them.

To do it within bash only (not requiring another process), you can use:

pax> ip=12.34.56.78
pax> echo ${ip%.[0-9]*}.0
12.34.56.0

Upvotes: 3

Related Questions