การแปลงช่วงของที่อยู่ IPv4 เป็น netmasks โดยใช้ bash


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

ฉันจะแปลงช่วงที่อยู่เป็น netmasks ได้อย่างไร ผลลัพธ์ควรเป็น:

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
ผลลัพธ์หลายรายการที่คุณขอไม่ถูกต้องดังนั้นจะไม่มีสคริปต์ทุบตีที่ถูกต้องสร้างขึ้น ตัวอย่างเช่นช่วงแรกไม่สามารถแสดงได้โดยใช้ netmask: 94.228.16.0/21 ให้ 94.228.16.0 - 94.228.23.255 และกว้างขึ้นถัดไป 94.228.16.0/20 ให้ 94.228.16.0 - 94.228.31.255 นอกจากนี้ช่วงที่ลงท้ายด้วย .0 ไม่สามารถสร้างได้โดย netmask ใด ๆ
zwets

@Zanna คุณกำลังโกงโปสเตอร์ที่ถามโดยใช้ทุบตี ทุบตีของฉันไม่มีipcalcbuiltin ;-)
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

โมดูลนี้มีอยู่ใน Ubuntu โดยติดตั้งlibnet-cidr-perlแพ็คเกจ

NBฉันยังไม่ได้ตรวจสอบการป้อนข้อมูลของคุณหรือผลลัพธ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.