데이터베이스를 사용하여 IP 주소를 좌표로 변환

데이터베이스를 사용하여 IP 주소를 좌표로 변환

IP가 포함된 파일이 있고 이를 로컬 데이터베이스(API 아님)를 사용하여 좌표와 비교하고 싶습니다.

나는 프로세스를 따라가며 이를 세분화하고 다양한 기사를 참조하는 스크립트를 만들려고 노력합니다.

좌표 데이터베이스 파일:

16777216 16777471 AU Australia Queensland Brisbane -27.467940 153.028090
16777472 16778239 CN China Fujian Fuzhou 26.061390 119.306110
16778240 16779263 AU Australia Victoria Melbourne -37.814000 144.963320
16779264 16781311 CN China Guangdong Guangzhou 23.116670 113.250000

IP 주소 파일:

131.72.136.65
131.72.138.204
131.72.138.45
131.72.139.112
131.72.139.163

그래서 먼저 비교할 수 있도록 IP를 10진수로 변경했습니다.

IP2Dec

#!/bin/bash
# while read line; do echo  "$line"; done < iplist.txt
ip2dec () {
    local a b c d ip=$@
    IFS=. read -r a b c d <<< "$ip"
    printf '%d\n' "$((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d))"
}

ip2dec "$@"

IP와 DB 파일을 비교하고 아래 스크립트를 사용하여 IP, 위도, 경도를 인쇄했습니다.

awk 'NR == FNR { x[$1] = $1+0; next; } { for (i in x) { if (x[i] > $1+0 && x[i] < $2+0) { print x[i], $NF-1, $NF;} } }' ip.txt db.txt

이제 출력은 다음과 같습니다.

387306133 -78.4875 -77.487490
399341146 -105.985 -104.984700
399478903 -105.985 -104.984700
401285510 -123.395 -122.395200
401289024 -123.395 -122.395200
520966134 102.85 103.850070

이제 십진수를 다시 IP 주소로 변환하고 싶습니다.

    #!/bin/bash
dec2ip () {
    local ip dec=$@
    for e in {3..0}
    do
        ((octet = dec / (256 ** e) ))
        ((dec -= octet * 256 ** e))
        ip+=$delim$octet
        delim=.
    done
    printf '%s\n' "$ip"
}
    dec2ip "$@"

그러나 이것은 전체 파일을 변환하므로 첫 번째 열만 변환하고 Lad와 Lon을 유지하고 싶습니다.

나는 이 모든 것들을 하나로 묶어 하나의 작품을 만들려고 노력한다.

또한 이것이 유효한 접근 방식입니까? 결국 나는 이 IP를 Google 지도에 표시하고 싶습니다.

답변1

IP2Dec 및 dec2ip 스크립트(파일의 일부에서만 실행되어야 함)를 제외하고 작동해야 합니다. 다음은 줄의 첫 번째 항목에만 함수를 적용하는 dec2ip의 예입니다.

#!/bin/bash
dec2ip () {
        local ip dec=$@
        delim=""
        for e in {3..0}
        do
                ((octet = dec / (256 ** e) ))
                ((dec -= octet * 256 ** e))
                ip+="$delim$octet"
                delim=.
        done
        printf '%s' "$ip"
}

while read IP lon lat ; do
        dec2ip $IP
        printf " %s %s\n" "$lon" "$lat"
done

더 나은 접근 방식은 모든 것을 고급 언어로 짧은 방식으로 작성하는 것입니다. 다음 Python 2.7 스크립트는 필요한 작업을 수행해야 합니다(속도에 최적화되지 않음).

#!/usr/bin/python   
import socket,struct
db=[]
for l in open("db.txt"):
    fields=l.split();
    db.append((int(fields[0]),int(fields[1]),fields[-2],fields[-1]))

for l in open("ip.txt"):
    ip=struct.unpack('!I',socket.inet_aton(l))[0]
    for e in db:
        if e[0]<=ip<=e[1]:
            print l.strip(),e[2],e[3]
            break

관련 정보