ที่อยู่ IP ระบุทศนิยมเป็น / 8 หรือ / 16 โดยใช้เครื่องหมาย bash, sed หรือ awk?


0

ฉันมีไฟล์อินพุตที่มีรายการที่อยู่ ip และ ip_counts (พารามิเตอร์บางตัวที่ฉันใช้ภายใน) ไฟล์มีลักษณะดังนี้

202.124.127.26  2135869
202.124.127.25  2111217
202.124.127.17  2058082
202.124.127.16  2014958
202.124.127.20  1949323
202.124.127.24  1933773
202.124.127.27  1932076
202.124.127.22  1886466
202.124.127.18  1882955
202.124.127.21  1803528
202.124.127.23  1786348
119.224.129.200  1776592
119.224.129.211  1639325
202.124.127.19  1479198
119.224.129.201  1145426
202.49.175.110  1133354
119.224.129.210  1119525
68.232.45.132  1085491
119.224.129.209  1015078
131.203.3.8   857951
202.162.73.4   817197
207.123.58.125   785326
202.7.6.18   762603
117.121.253.254   718022
74.125.237.120   710448
68.232.44.219   693002
202.162.73.2   671559
205.128.75.126   611301
119.161.91.17   604393
119.224.129.202   559930
8.27.241.126   528862
74.125.237.152   517516
8.254.9.254   514341

ในขณะที่คุณสามารถดูที่อยู่ IP ของตัวเองไม่ได้เรียงดังนั้นฉันใช้คำสั่ง sort ในไฟล์เพื่อเรียงลำดับที่อยู่ IP ดังต่อไปนี้

cat address_count.txt | เรียงลำดับ -t -k 1,1n -k 2,2n -k 3,3n -k 4,4n & gt; sorted_address.txt

ซึ่งให้ฉันเอาท์พุทที่มีที่อยู่ ip ในการเรียงลำดับเอาท์พุทบางส่วนของไฟล์ที่แสดงด้านล่าง

4.23.63.126    15731
4.26.254.254   320705
4.27.8.254    25174
8.12.129.50   176141
8.12.223.125    11800
8.19.32.65    15854
8.19.240.53    11013
8.19.240.70    11915
8.19.240.72    31541
8.19.240.73    23304
8.20.213.28    96434
8.20.213.32   108191
8.20.213.34   170058
8.20.213.39    23512
8.20.213.41    10420
8.20.213.61    24809
8.26.195.253    28568
8.27.152.253   104446
8.27.233.125   115856
8.27.235.126    16102
8.27.235.254    25628
8.27.238.254   108485
8.27.240.125   169262
8.27.241.126   528862
8.27.241.252   197302
8.27.248.125    14926
8.254.9.254   514341
12.129.210.71    89663
15.192.45.21    20139
15.192.45.26    35265
15.193.0.148    10313
15.193.113.29    40318
15.201.49.136    14243
15.240.238.52    57163
17.250.248.95    28166
23.33.125.13    19179
23.33.125.37    17953
31.151.163.60    72709
38.99.42.37   192356
38.99.68.180    41251
38.99.68.181    10272
38.104.237.74    74012
38.108.112.103    37034
38.108.112.115    69698
38.108.112.121    92173
38.108.112.122    99230
38.112.63.238    39958
38.119.130.62    42159
46.4.28.22       19769

ตอนนี้ฉันต้องการแยกไฟล์ที่ระบุข้างต้นและแปลงเป็นรูปแบบ aaa.bbb.ccc.0 / 8 และรูปแบบ aaa.bbb.0.0 / 16 และฉันยังต้องการนับจำนวนการปรากฏของไอพีในแต่ละเครือข่ายย่อยด้วย ต้องการทำสิ่งนี้โดยใช้ bash ฉันเปิดให้ใช้ sed หรือ awk ฉันจะทำสิ่งนี้ได้อย่างไร

ตัวอย่างเช่น

8.19.240.53    11013
8.19.240.70    11915
8.19.240.72    31541
8.19.240.73    23304
8.20.213.28    96434
8.20.213.32   108191
8.20.213.34   170058
8.20.213.39    23512
8.20.213.41    10420
8.20.213.61    24809

ส่วนที่เกี่ยวกับอินพุตควรสร้าง 8.19.240.0/8 และ 8.20.213.0/8 และในทำนองเดียวกันสำหรับ / 16 โดเมนฉันยังต้องการนับการเกิดขึ้นของเครื่องในซับเน็ต ตัวอย่างเช่นในผลลัพธ์ข้างต้นซับเน็ตนี้ควรมีจำนวน 4 ในคอลัมน์ถัดไปข้างนอกจากนี้ควรเพิ่ม count.i.e ที่แสดงอยู่แล้ว (11013 + 11915 + 31541 + 23304) ในคอลัมน์อื่น

8.19.240.0/8 4 (11013 + 11915 + 31541 + 23304) 8.20.213.0/8 6 (96434 + 108191 + 170058 + 23512 + 10480 24809)

มันจะดีถ้ามีคนแนะนำวิธีที่จะทำให้สำเร็จ


คุณแน่ใจหรือไม่ว่าคุณต้องการ 8.19.240.0/8; ฉันสงสัยว่าคุณหมายถึง 8.19.240.0/24 เนื่องจากความยาวของคำนำหน้า (ตัวเลขหลัง /) หมายถึงจำนวนบิตที่อาจตั้งค่าไม่ใช่จำนวนบิตที่ zeroed
chepner

คำตอบ:


1

หาก gawk-foo ของคุณแข็งแกร่งคุณอาจแทนที่ทั้งหมดนี้ด้วยสคริปต์ awk เดียว แต่ฉันพบว่ามันง่ายกว่าที่จะแฮกด้วยกัน

while read; do
    ipcalc $(awk '{print $1}' <(echo "$REPLY")) |
    awk '/^Network:/ {print $2}'
done < sorted_address.txt

เห็นได้ชัดว่ามันอาศัย ipcalc แต่การแยกวิเคราะห์ที่จะเจ็บปวดน้อยกว่าการพยายามแยกวิเคราะห์ของคุณเองใน Bash

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