সময়ে সময়ে আমি আমার অ্যাপাচি লগ ফাইলগুলির মধ্যে সিআইডিআর রেঞ্জগুলি গ্রেপ করতে চাই। প্রাকৃতিক সীমানায় (/ 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
এই রেজেক্সগুলি আইপি ঠিকানাগুলিকে অগ্রাহ্য করে যা নেতৃস্থানীয় শূন্যগুলি অন্তর্ভুক্ত করে, যেমন 192.168.001.001
অ্যাপাচি লগ ফাইলগুলিতে কোনও সমস্যা নয় তবে অন্যান্য লগ ফাইলগুলিতে হতে পারে। বিশেষত মুদ্রকগুলি নেতৃস্থানীয় জিরো পছন্দ করে বলে মনে হচ্ছে। রিজেক্সে erচ্ছিক শূন্যগুলি যুক্ত করা যথেষ্ট সহজ তবে এটি পুরো জিনিসটিকে কিছুটা আরও কঠিন করে তুলেছে। একটি সহজ উপায় আছে।
কোনও সিআইডিআর রেঞ্জের সাথে মেলে এমন কোনও ফাইল থেকে লাইনগুলি নির্বাচন করার কি সহজ উপায় আছে?
অভিনব রেজেক্স এক্সটেনশানগুলি বিভিন্ন সরঞ্জাম হিসাবে বিবেচিত হবে (যেমন awk
বা perl
প্রয়োজনে তবে আমি এটি ওয়ান-লাইনার হতে চাই) যদি তারা কাজটি আরও সহজ করে তোলে। আদর্শভাবে, আমি যা চাই তা হ'ল কিছু
grep "[:CIDR 192.168.128.0/18:]" access_log
একটি সরঞ্জাম যা একটি সিআইডিআর পরিসরকে উপযুক্ত রেজেজেসে রূপান্তরিত করে তাও ঠিক আছে।
$ 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
বোনাস পয়েন্ট যদি আপনার উত্তরটি আইপিভি 6ও অন্তর্ভুক্ত করে।