awk — Subnet Calculations

Convert IP + prefix to network address — pure awk bit math
echo "192.168.1.100/24" | awk -F'[./]' '{
    ip=lshift($1,24)+lshift($2,16)+lshift($3,8)+$4
    mask=lshift(2^$5-1, 32-$5)
    net=and(ip,mask)
    printf "network: %d.%d.%d.%d/%s\n",rshift(net,24)%256,rshift(net,16)%256,rshift(net,8)%256,net%256,$5
}'
Calculate usable host count from prefix length
echo "24" | awk '{hosts=2^(32-$1)-2; printf "/%d = %d usable hosts\n",$1,hosts}'
Subnet mask from prefix length
echo "24" | awk '{
    mask=lshift(2^$1-1, 32-$1)
    printf "/%d = %d.%d.%d.%d\n",$1,rshift(mask,24)%256,rshift(mask,16)%256,rshift(mask,8)%256,mask%256
}'
Count hosts per /24 subnet from IP list
cat <<'EOF' > /tmp/ips.txt
10.50.1.1
10.50.1.20
10.50.1.50
10.50.1.42
10.50.2.10
10.50.2.15
192.168.1.100
EOF
awk -F'.' '{subnet=$1"."$2"."$3".0/24"; count[subnet]++} END{for(s in count) printf "%-18s %d hosts\n",s,count[s]}' /tmp/ips.txt | sort -t'.' -k1,1n -k2,2n -k3,3n
Check if IP falls within a /24 subnet
echo "10.50.1.42" | awk -F'.' '{if($1==10 && $2==50 && $3==1) print "IN 10.50.1.0/24"; else print "OUTSIDE"}'
Wildcard mask from prefix (Cisco ACL style)
echo "24" | awk '{
    mask=lshift(2^$1-1, 32-$1)
    wild=compl(mask) % 2^32
    printf "wildcard: %d.%d.%d.%d\n",rshift(wild,24)%256,rshift(wild,16)%256,rshift(wild,8)%256,wild%256
}'