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