Захоплення для діапазонів CIDR


10

Час від часу я хочу зібрати діапазони 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

Ці реджекси ігнорують IP-адреси, які містять провідні нулі, наприклад 192.168.001.001, що не є проблемою в файлах журналу Apache, але може бути в інших файлах журналу. Зокрема, принтерам подобаються провідні нулі. Досить просто додати необов'язкові нулі до регулярного виразу, але це просто ускладнить все. Має бути простіший спосіб.

Чи є простий спосіб вибрати рядки з файлу, які відповідають будь-якому діапазону 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.



Відповіді:


17

Існує, не дивно, що інструмент для цього: grepcidr.

Він за замовчуванням не входить у будь-яку систему, про яку я знаю, але ви можете завантажити його звідси , і він знаходиться як у сховищі пакетів Ubuntu, так і в колекції портів FreeBSD.

(Версія 2.0 працює і з мережами IPv6)


2
Якщо вам потрібен функціонал IPv6, щось жахливе можна зламати разом, використовуючи Net :: CIDR в
перл

Я також створив невеликий інструмент CLI на основі Node.js для IPv4 cidr-grepping
Michele

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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.