Как разобрать IP-адреса из журнала сервера Apache? - PullRequest
1 голос
/ 09 февраля 2011

Мне нужно найти часто встречающиеся IP-адреса из журналов Apache.

12.1.12.1 9000 127.0.0.1 - откровенный [10 / Oct / 2000: 13: 55: 36 -0700] "GET /apache_pb.gif HTTP / 1.0 "200 2326" http://www.example.com/start.html" "Mozilla / 4.08 [en] (Win98; I; Nav)"

12.1.12.1 9000 192.145.1.23 - откровенный [10 / Oct /2000: 13: 55: 36 -0700] "GET /apache_pb.gif HTTP / 1.0" 200 2326 "http://www.example.com/start.html"" Mozilla / 4.08 [en] (Win98; I; Nav) "

Как извлечь IP-адреса (т.е. 3-е слово в каждой строке) с помощью регулярных выражений в Java?Кроме того, я должен найти наиболее распространенные IP-адреса из него, для обнаружения роботизированного доступа.Журнал содержит миллионы строк, поэтому для этого может подойти регулярное выражение.

Ответы [ 4 ]

3 голосов
/ 09 февраля 2011

Как уже отмечали другие, вам не нужны регулярные выражения.Вы также не должны использовать String.split, поскольку он также использует регулярные выражения.Вместо этого вы можете использовать StringTokenizer.Предполагая, что вы используете BufferedReader br для чтения в каждой строке:

String line = br.readLine();
StringTokenizer st = new StringTokenizer(line, " ");
st.nextToken();
st.nextToken();
String ip = st.nextToken();
3 голосов
/ 09 февраля 2011

Если вы уверены, что это всегда 3-е слово (как вы сказали), возможно, вам вообще не нужны регулярные выражения.Вы можете просто взять третье слово с помощью простого разделения.

Однако кто-то уже спросил, что: Регулярное выражение для соответствия имени хоста DNS или IP-адресу? ...

0 голосов
/ 09 февраля 2011

Формат файла журнала доступа всегда зависит от настроек файла конфигурации.Вероятно, было бы лучше вместо предположения, что IP-адрес является третьим «словом», прочитать текущий файл конфигурации и проанализировать файл журнала доступа в соответствии с записью LogFormat.

Apache httpd работает в соответствии с httpd.conf и Tomcat для server.xml .server.xml - это файл XML, который делает синтаксический анализ AccessLogValve стандартной процедурой.

Это немного больше работы, но она сделает ваше приложение более гибким в случае необходимости сохранения.Я думаю, что для этого подхода строковые методы будут проще использовать, чем регулярные выражения.

0 голосов
/ 09 февраля 2011

Вот одно из решений:

String str1 = "12.1.12.1 9000 127.0.0.1 - frank [10/Oct/2000:13:55:36"
            + " -0700] \"GET /apache_pb.gif HTTP/1.0\" 200 2326 "
            + "\"http://www.example.com/start.html\" \"Mozilla/4.08 "
            + "[en] (Win98; I ;Nav)\"";

String str2 = "12.1.12.1 9000 192.145.1.23 - frank [10/Oct/2000:13:55"
            + ":36 -0700] \"GET /apache_pb.gif HTTP/1.0\" 200 2326 "
            + "\"http://www.example.com/start.html\" \"Mozilla/4.08 "
            + "[en] (Win98; I ;Nav)\"";

Pattern p = Pattern.compile("\\S+\\s+\\S+\\s+(\\S+).*");

Matcher m = p.matcher(str1);
if (m.matches())
    System.out.println(m.group(1));

m = p.matcher(str2);
if (m.matches())
    System.out.println(m.group(1));

Reg-ex breakdown:

  • \S+, один или несколько непробельных пробелов.
  • \s+, один или несколько пробельных символов.
  • ...
  • (\\S+) один или несколько непробельных символов, захваченных в группе 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...