См. Функцию INET_NTOA
, вы можете использовать ее для преобразования числа в IP на сервере MySQL.
Поскольку вы просили Bash:
INET_NTOA() {
local IFS=. num quad ip e
num=$1
for e in 3 2 1
do
(( quad = 256 ** e))
(( ip[3-e] = num / quad ))
(( num = num % quad ))
done
ip[3]=$num
echo "${ip[*]}"
}
INET_ATON ()
{
local IFS=. ip num e
ip=($1)
for e in 3 2 1
do
(( num += ip[3-e] * 256 ** e ))
done
(( num += ip[3] ))
echo "$num"
}
Примеры:
$ INET_ATON 10.2.1.255
167903743
$ INET_NTOA 167903743
10.2.1.255
Вот версия, которая будет работать в любой из оболочек, производных от Bourne, которые я пробовал, включая dash, ksh, несколько версий Bash, BusyBox ash, zsh (с -y
) и даже Heirloom Bourne Shell.
INET_NTOA() {
num=$1
ip=
for e in 3 2 1
do
quad=`echo "256 ^ $e" | bc`
if [ -n "$ip" ]
then
ip=$ip.
fi
ip=$ip`echo "$num / $quad" | bc`
num=`echo "$num % $quad" | bc`
done
ip=$ip.$num
echo "$ip"
}
INET_ATON ()
{
num=0
e=3
saveIFS=$IFS
IFS=.
set -- $1
IFS=$saveIFS
for ip in "$@"
do
num=`echo "$num + $ip * 256 ^ $e" | bc`
e=`echo "$e - 1" | bc`
done
echo "$num"
}
Предположим, у вас есть поле с именем ip_addr
в таблице с именем hosts
Тогда
select INET_NTOA(ip_addr) from hosts;
выполнит запрос и вернет четыре IP-адреса с точками в результирующем наборе.