समय-समय पर मैं अपने अपाचे लॉग फ़ाइलों से CIDR पर्वतमाला को निकालना चाहता हूं। यह उन सीमाओं के लिए आसान है जो प्राकृतिक सीमाओं (/ 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
, जो अपाचे लॉग फ़ाइलों में कोई समस्या नहीं है, लेकिन अन्य लॉग फ़ाइलों में हो सकता है। विशेष रूप से प्रिंटर प्रमुख शून्य को पसंद करते हैं। आरजेक्स में वैकल्पिक शून्य को जोड़ना काफी आसान है लेकिन यह पूरी बात को थोड़ा और कठिन बना देता है। एक आसान तरीका है।
क्या किसी फ़ाइल से लाइनों का चयन करने का एक आसान तरीका है जो किसी भी CIDR रेंज से मेल खाता है?
फैंसी रेगेक्स एक्सटेंशन को विभिन्न उपकरणों के रूप में माना जाएगा (जैसे कि awk
या perl
यदि आवश्यक हो लेकिन मैं चाहता हूं कि यह एक-लाइनर हो) यदि वे काम को आसान बनाते हैं। आदर्श रूप में, मुझे जो पसंद है वह कुछ ऐसा है
grep "[:CIDR 192.168.128.0/18:]" access_log
एक उपकरण जो CIDR रेंज को उचित रेगेक्स में परिवर्तित करता है वह भी ठीक होगा।
$ 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 को कवर करता है तो बोनस अंक।