bash를 사용하여 IPv4 주소 범위를 넷 마스크로 변환


10

IPv4 주소를 가진 입력 파일이 있습니다 :

94.228.16.0 - 94.228.25.255
94.241.136.0/24
94.241.136.0 - 94.241.136.255
94.29.128.0/17
94.29.128.0 - 94.29.191.0
94.29.192.0 - 94.29.255.0
94.74.181.0/24
94.74.181.0 - 94.74.181.31
94.74.181.128 - 94.74.181.255

주소 범위를 넷 마스크로 변환하려면 어떻게해야합니까? 결과는 다음과 같아야합니다.

94.228.16.0/21
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.128.0/19
94.29.192.0/19
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

3
요청한 결과 중 일부가 올바르지 않으므로 유효한 bash 스크립트가 결과를 생성하지 않습니다. 예를 들어 첫 번째 범위는 넷 마스크를 사용하여 표현할 수 없습니다. 또한 .0으로 끝나는 범위는 넷 마스크로 생성 할 수 없습니다.
zwets

@Zanna 당신이 바람을 피우고, 포스터는 bash 사용을 요청했습니다 . 내 배쉬에는 ipcalc내장 기능 이 없습니다 . ;-)
zwets

@zwets 아 알아 냈어! 그러나 당신 말이 맞아요, 쉘은 많은 도움이 필요합니다
Zanna

답변:


14

먼저 변환을 수행하기 위해 패키지를 설치해야합니다

sudo apt install ipcalc

이제이 작은 스크립트 로이 작업을 수행 할 수 있습니다 (변수를 인용하면 작동하지 않습니다).

$ while read line; do if [[ $line = *-* ]]; then (ipcalc $line | sed '2!d'); else echo $line; fi; done < file
94.228.16.0/21
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.128.0/19
94.29.192.0/19
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

더 읽기 쉽게

while read line; do
   if [[ $line = *-* ]]; then 
     (ipcalc $line | sed '2!d')
   else echo $line
   fi
done < file

항상 즐거움 : @Oleksii
ZANNA

3

놀랍지 않게도 CPAN perl 모듈 Net :: CIDR 이 있습니다.

예를 들어 :

$ perl -MNet::CIDR=range2cidr -lne 'print for range2cidr $_' yourfile
94.228.16.0/21
94.228.24.0/23
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.191.0/32
94.29.128.0/19
94.29.160.0/20
94.29.176.0/21
94.29.184.0/22
94.29.188.0/23
94.29.190.0/24
94.29.255.0/32
94.29.192.0/19
94.29.224.0/20
94.29.240.0/21
94.29.248.0/22
94.29.252.0/23
94.29.254.0/24
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

모듈은 libnet-cidr-perl패키지 를 설치하여 Ubuntu에서 사용할 수 있습니다 .

NB 나는 한 하지 귀하의 의견이나 결과를 확인.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.