บางครั้งฉันต้องการ 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 ด้วย