grepping สำหรับช่วง CIDR


10

บางครั้งฉันต้องการ grep CIDR ออกจากไฟล์บันทึก Apache ของฉัน สิ่งนี้เป็นเรื่องง่ายสำหรับช่วงที่อยู่ในขอบเขตธรรมชาติ (/ 8, / 16 และ / 24) แต่ไม่ใช่เรื่องง่ายสำหรับช่วงอื่นเช่น / 17 และ / 25

ตัวอย่าง:

# 192.168.0.0/16: (easy)
grep " 192\.168\." access_log

# 192.168.128.0/17: (more thought required)
grep -E " 192\.168\.(12[89]|1[3-9][0-9]|2[0-5][0-9])\." access_log

# 192.168.0.0/17: (more thought required)
grep -E " 192\.168\.([0-9]|[0-9][0-9]|1[01][0-9]|12[0-7])\." access_log

# 192.168.128.0/18: (straining my brain)
grep -E " 192\.168\.(1[2-8][0-9]|19[01])\." access_log

regexes เหล่านี้จะไม่สนใจที่อยู่ IP ที่มีศูนย์นำหน้าเช่น192.168.001.001ซึ่งไม่ใช่ปัญหาในไฟล์บันทึกของ Apache แต่อาจอยู่ในไฟล์บันทึกอื่น ๆ เครื่องพิมพ์โดยเฉพาะดูเหมือนจะชอบศูนย์ชั้นนำ มันง่ายพอที่จะเพิ่มเลขศูนย์ทางเลือกลงใน regex แต่มันทำให้ยากขึ้นอีกหน่อย จะต้องมีวิธีที่ง่ายกว่า

มีวิธีง่าย ๆ ในการเลือกบรรทัดจากไฟล์ที่ตรงกับช่วง CIDR หรือไม่?

ส่วนขยายแฟนซี regex จะได้รับการพิจารณาว่าเป็นเครื่องมือที่แตกต่างกัน (เช่นawkหรือperlหากจำเป็น แต่ฉันต้องการให้เป็นหนึ่งซับ) ถ้าพวกเขาทำให้งานง่ายขึ้น นึกคิดสิ่งที่ฉันต้องการคืออะไร

grep "[:CIDR 192.168.128.0/18:]" access_log

เครื่องมือที่แปลงช่วง CIDR เป็น regex ที่เหมาะสมก็จะเป็น OK

$ cidr2regex 192.168.0.0/18
192\.168\.(1[2-8][0-9]|19[01])\.[0-9]{1,3}

หรือ

$ grep -E "$(cidr2regex 192.168.0.0/18)" access_log

คะแนนโบนัสหากคำตอบของคุณครอบคลุม IPv6 ด้วย


1
ขณะที่การค้นหารอบนี้ผมพบว่าเครื่องมือบนเว็บสำหรับการแปลงช่วง IP regexes
Ladadadada

และตอนนี้มันได้ย้ายมาที่นี่
Ladadadada

คำตอบ:


17

grepcidrมีแปลกใจเครื่องมือสำหรับการนี้:

โดยค่าเริ่มต้นจะไม่รวมอยู่ในระบบใด ๆ ที่ฉันทราบ แต่คุณสามารถดาวน์โหลดได้จากที่นี่และอยู่ในที่เก็บแพคเกจ Ubuntu และคอลเลกชันพอร์ต FreeBSD เช่นกัน

(เวอร์ชัน 2.0 ทำงานได้กับเครือข่าย IPv6 ด้วย)


2
หากคุณต้องการฟังก์ชั่น IPv6 สิ่งที่น่ากลัวอาจถูกแฮกรวมเข้าด้วยกันโดยใช้ Net :: CIDR ใน perl ...
voretaq7

ฉันยังได้สร้างเครื่องมือ CLI ที่ใช้ Node.js ขนาดเล็กสำหรับ IPv4 cidr-grepping
Michele Pangrazzi

5

rgxgเครื่องมือบรรทัดคำสั่งที่เพิ่งเปิดตัวสร้างนิพจน์ทั่วไปที่ตรงกับที่อยู่ทั้งหมดในบล็อก CIDR:

$ rgxg cidr 192.168.128.0/18
192\.168\.(19[01]|1[3-8][0-9]|12[89])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])

หรือ

$ rgxg cidr 2001:db8:a:b:c:d::/112
2001:0?[Dd][Bb]8:0?0?0?[Aa]:0?0?0?[Bb]:0?0?0?[Cc]:0?0?0?[Dd]((::[0-9A-Fa-f]{1,4}|::|:0?0?0?0(::|:[0-9A-Fa-f]{1,4}))|:0\.0(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){2})

สำหรับข้อมูลเพิ่มเติมโปรดดูที่http://rgxg.sf.net

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