如何在bash中有效地将long int转换为点分四进制IP

Mar*_*ark 6 mysql bash

我在一个存储为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)


Luk*_*ský 10

查看该INET_NTOA函数,您可以使用它将数字转换为MySQL服务器上的IP.