동일한 /24 네트워크에 속한 그룹 IP 주소

동일한 /24 네트워크에 속한 그룹 IP 주소

IPv4 주소 및 /24 네트워크 목록이 포함된 파일이 있습니다.

IP 주소는 이미 고유하며 4개의 옥텟으로 모두 정렬되어 있습니다.

bash를 사용하여 동일한 /24 서브넷에 속하는 주소를 그룹화하고(해당 서브넷에 주소가 여러 개 있는 경우) 그렇지 않으면 IP 주소를 목록에 유지하고 싶습니다.

예를 들어:

10.0.0.1
10.0.0.2
10.20.0.0/24
10.30.10.1
10.30.10.2
192.168.0.1
192.168.1.5
192.168.30.0/24
192.168.50.3

원하는 출력:

10.0.0.0/24
10.20.0.0/24
10.30.10.0/24
192.168.0.1
192.168.1.5
192.168.30.0/24
192.168.50.3

답변1

기본 아이디어는 각 /24네트워크를 해당 네트워크에 서브넷 배열을 저장하는 키로 사용하는 것입니다. 그런 다음 각 배열의 길이를 기반으로 출력을 생성합니다. 그러나 이 접근 방식에는 단점이 있는데, 이는스트리밍은 지원되지 않습니다.

참고용으로만

AWK

awk '{
    if (index($0, "/") > 0) { ip_map[$0] = "" } 
    else {
        split($0, parts, ".")
        network = parts[1]"."parts[2]"."parts[3]".0/24"
        if (network in ip_map) { ip_map[network] = ip_map[network]" "$0 } 
    else { ip_map[network] = $0 }
    }
}
END {
    for (k in ip_map) {
        if (ip_map[k] == "" || split(ip_map[k], arr) > 1) { print k } 
    else { print ip_map[k] }
    }
}' | sort -n

세게 때리다

#!/bin/bash

# or use `readarray -t` to read input from a file

ips=(
    "10.0.0.1"
    "10.0.0.2"
    "10.0.0.3"
    "10.20.0.0/24"
    "10.30.10.1"
    "10.30.10.2"
    "192.168.0.1"
    "192.168.1.5"
    "192.168.30.0/24"
    "192.168.50.3"
)

declare -A ip_map

for ip in "${ips[@]}"; do
    if [[ "$ip" == *"/"* ]]; then
        ip_map["$ip"]=null
    else
    network=$(echo "$ip" | { IFS="."; read a b c d; echo "$a.$b.$c.0/24"; })
        if [[ ${ip_map[$network]+_} ]]; then
            ip_map["$network"]+=" $ip"
        else
            ip_map["$network"]="$ip"
        fi
    fi
done

for k in "${!ip_map[@]}"; do
    if [[ "${ip_map[$k]}" == null || $(echo "${ip_map[$k]}" | wc -w) -gt 1 ]]; then
        echo "$k"
    else
        echo "${ip_map[$k]}"
    fi
done | sort -n

파이썬

import ipaddress
ips = [
    "10.0.0.1",
    "10.0.0.2",
    "10.0.0.3",
    "10.20.0.0/24",
    "10.30.10.1",
    "10.30.10.2",
    "192.168.0.1",
    "192.168.1.5",
    "192.168.30.0/24",
    "192.168.50.3",
]
ip_map = {}

for ip in ips:
    if "/" in ip:
        ip_map[ip] = None
    else:
        network = ipaddress.ip_network(ip + "/24", strict=False)
        try:
            ip_map[network].append(ip)
        except KeyError:
            ip_map[network] = [ip]
        
for k, v in ip_map.items():
    if v is None or len(v) > 1:
        print(k)
    elif len(v) == 1:
        print(v[0])

관련 정보