Zaman zaman Apache günlük dosyalarımdan CIDR aralıklarını grep etmek istiyorum. Bu, doğal sınırlara (/ 8, / 16 ve / 24) düşen aralıklar için kolaydır, ancak / 17 ve / 25 gibi diğer aralıklar için o kadar kolay değildir.
Örnekler:
# 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
Bu 192.168.001.001
normal ifadeler, Apache günlük dosyalarında sorun olmayan, ancak diğer günlük dosyalarında olabilecek, başta sıfır bulunan IP adreslerini yok sayar . Özellikle yazıcılar önde gelen sıfırları sevmektedir. Normal ifadeye isteğe bağlı sıfırları eklemek yeterince kolaydır, ancak her şeyi biraz daha zorlaştırır. Daha kolay bir yol olmalı.
Bir dosyadan herhangi bir CIDR aralığıyla eşleşen satırları seçmenin kolay bir yolu var mı?
Süslü regex uzantıları , işi kolaylaştırırlarsa farklı araçlar ( gerekirse awk
veya perl
gerekirse tek katmanlı olmasını istiyorum) olarak kabul edilecektir. İdeal olarak, istediğim şey
grep "[:CIDR 192.168.128.0/18:]" access_log
Bir CIDR aralığını uygun normal ifadeye dönüştüren bir araç da uygun olacaktır.
$ cidr2regex 192.168.0.0/18
192\.168\.(1[2-8][0-9]|19[01])\.[0-9]{1,3}
veya
$ grep -E "$(cidr2regex 192.168.0.0/18)" access_log
Cevabınız IPv6'yı da içeriyorsa bonus puanları.