alcybery
alcybery

Reputation: 55

Format list of IP addresses using sed adding subnet mask if necessary

I have a list of IP addresses like that:

208.69.112.145
54.230.228.48
104.21.75.86/31
104.16.139.76
172.67.210.123
104.21.54.226/31
45.146.81.248/31
205.251.219.56/30

It needs to be converted to this format:

route 208.69.112.145/32 reject;
route 54.230.228.48/32 reject;
route 104.21.75.86/31 reject;
route 104.16.139.76/32 reject;
route 172.67.210.123/32 reject;
route 104.21.54.226/31 reject;
route 45.146.81.248/31 reject;
route 205.251.219.56/30 reject;

So every address should start with route and end with reject;

Except for the lines that don't have a subnet mask, for those lines /32 reject; should be added instead.

This works, but it adds /32 to every line:

cat /ip.lst | sed 's_.*_route &/32 reject;_' > /ip.txt

Upvotes: 0

Views: 326

Answers (2)

anubhava
anubhava

Reputation: 785481

You may use this sed:

sed -E 's~^~route ~; s~\.[0-9]+$~&/32~; s~$~ reject;~' file

route 208.69.112.145/32 reject;
route 54.230.228.48/32 reject;
route 104.21.75.86/31 reject;
route 104.16.139.76/32 reject;
route 172.67.210.123/32 reject;
route 104.21.54.226/31 reject;
route 45.146.81.248/31 reject;
route 205.251.219.56/30 reject;

Or this awk:

awk -F/ '{print "route", $0 (NF==2 ? "" : "/32"), "reject;"}' file

route 208.69.112.145/32 reject;
route 54.230.228.48/32 reject;
route 104.21.75.86/31 reject;
route 104.16.139.76/32 reject;
route 172.67.210.123/32 reject;
route 104.21.54.226/31 reject;
route 45.146.81.248/31 reject;
route 205.251.219.56/30 reject;

Upvotes: 3

KamilCuk
KamilCuk

Reputation: 141493

Add 32 only if it's missing.

sed '\_/[0-9][0-9]_!s_$_/32_; s_.*_route & reject;_'

Hope you'll get the idea.

Upvotes: 3

Related Questions