Cắt xén cho phạm vi CIDR


10

Thỉnh thoảng tôi muốn grep CIDR ra khỏi các tệp nhật ký Apache của tôi. Điều này dễ dàng cho các phạm vi nằm trên ranh giới tự nhiên (/ 8, / 16 và / 24) nhưng không dễ dàng cho các phạm vi khác như / 17 và / 25.

Ví dụ:

# 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

Các regex này bỏ qua các địa chỉ IP bao gồm các số 0 đứng đầu, chẳng hạn như 192.168.001.001, đây không phải là vấn đề trong các tệp nhật ký Apache nhưng có thể nằm trong các tệp nhật ký khác. Máy in đặc biệt có vẻ thích các số 0 hàng đầu. Thật dễ dàng để thêm các số 0 tùy chọn vào regex nhưng nó chỉ làm cho toàn bộ điều này trở nên khó khăn hơn một chút. Cần phải có một cách dễ dàng hơn.

Có cách nào dễ dàng để chọn các dòng từ một tệp phù hợp với bất kỳ phạm vi CIDR nào không?

Các tiện ích mở rộng regex lạ mắt sẽ được coi là các công cụ khác nhau (chẳng hạn như awkhoặc perlnếu cần nhưng tôi muốn nó là một công cụ một lớp) nếu chúng làm cho công việc dễ dàng hơn. Lý tưởng nhất, những gì tôi muốn là một cái gì đó như

grep "[:CIDR 192.168.128.0/18:]" access_log

Một công cụ chuyển đổi phạm vi CIDR thành regex thích hợp cũng sẽ ổn.

$ cidr2regex 192.168.0.0/18
192\.168\.(1[2-8][0-9]|19[01])\.[0-9]{1,3}

hoặc là

$ grep -E "$(cidr2regex 192.168.0.0/18)" access_log

Điểm thưởng nếu câu trả lời của bạn cũng bao gồm IPv6.


1
Trong khi tìm kiếm xung quanh điều này, tôi đã tìm thấy một công cụ dựa trên web để chuyển đổi phạm vi IP thành biểu thức chính quy .
Ladadadada

Câu trả lời:


17

Không có gì đáng ngạc nhiên, một công cụ cho việc này : grepcidr.

Nó không được bao gồm theo mặc định với bất kỳ hệ thống nào tôi biết, nhưng bạn có thể tải xuống từ đây và nó nằm trong cả kho lưu trữ gói Ubuntu và bộ sưu tập cổng FreeBSD.

(Phiên bản 2.0 cũng hoạt động với mạng IPv6)


2
Nếu bạn cần chức năng IPv6, một cái gì đó khủng khiếp có thể bị hack cùng nhau bằng Net :: CIDR trong perl ...
voretaq7

Tôi cũng đã xây dựng một công cụ CLI nhỏ dựa trên Node.js cho cidr-grepping IPv4
Michele Pangrazzi

5

Công rgxgcụ dòng lệnh được phát hành gần đây tạo ra các biểu thức chính quy khớp với tất cả các địa chỉ trong khối 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])

hoặc là

$ 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})

Để biết thêm thông tin, xem http://rgxg.sf.net .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.