Con CIDR (Classless Inter Domain Routing) il vecchio concetto di classe è sparito. Invece crei le tue reti impostando la subnet mask corretta e il tuo routing. Così tanto per la storia. :-)
Mentre il mio Yosemite emette netmasks in ifconfig in hex, ho scritto uno script di shell che analizza tutto l'output di ifconfig e calcola la rete da esso. Forse potresti modificarlo in base alle tue esigenze. Un esempio di output sarebbe:
IP adress: 127.0.0.1 Netmask: 255.0.0.0 Network: 127.0.0.0
IP adress: 172.20.41.52 Netmask: 255.255.255.0 Network: 172.20.41.0
IP adress: 172.16.47.1 Netmask: 255.255.255.0 Network: 172.16.47.0
IP adress: 192.168.97.1 Netmask: 255.255.255.0 Network: 192.168.97.0
Ecco la sceneggiatura; omette gli indirizzi inet6 da ifconfig e si riferisce solo a IPv4:
#!/bin/sh
IP="'ifconfig -a | fgrep 'inet ' | sed -e 's/^.*netmask:\(.*\)$//g' -e 's/^.*inet\ \([^\ ]*\)\ .*$//''"
convert_hex_netmask_to_dec () {
nh=$1
nd=$(($nh % 0x100))
for i in 1 2 3
do
((nh = nh / 0x100))
nd="$((nh % 0x100)).$nd"
done
echo $nd
# See more at: http://compgroups.net/comp.unix.shell/convert-hex-to-decimal/497395#sthash.ShzT161v.dpuf
}
for ipadress in ${IP}
do
netmaskhex="'ifconfig -a | fgrep 'inet ' | grep ${ipadress} | awk '{print $4}''"
netmaskdec="'convert_hex_netmask_to_dec ${netmaskhex}'"
IFS=. read -r i1 i2 i3 i4 <<< "${ipadress}"
IFS=. read -r m1 m2 m3 m4 <<< "${netmaskdec}"
NET="'printf \"%d.%d.%d.%d\n\" \"$((i1 & m1))\" \"$(($i2 & m2))\" \"$((i3 & m3))\" \"$((i4 & m4))\"'"
printf "IP adress:%15s Netmask:%15s Network:%15s\n" ${ipadress} ${netmaskdec} ${NET}
done
Se vuoi solo il primo ottetto dalla rete, basta disabilitare la stampa finale e sostituirla con
printf "%d\n" "$((i1 & m1))"