我在一个存储为long int的大型mysql数据库中有很多IP地址.我需要一种有效/快速的方法将它们转换回BASH shell脚本中的IP(或者让mysql将结果作为IP返回).
注意:特别是不想调用perl,awk或其他"语言".
Pau*_*ce. 15
既然你要求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"
}
Run Code Online (Sandbox Code Playgroud)
例子:
$ INET_ATON 10.2.1.255
167903743
$ INET_NTOA 167903743
10.2.1.255
Run Code Online (Sandbox Code Playgroud)
这个版本适用于我试过的任何Bourne派生的shell,包括dash,ksh,几个版本的Bash,BusyBox ash,zsh(with -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"
}
Run Code Online (Sandbox Code Playgroud)