我必须从apache日志中找到常见的IP地址。
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)”
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)”
如何使用Java中的正则表达式提取IP地址(即每行中的第3个字)? 此外,我必须从中找到最常见的IP地址,以便找到机器人访问权限。 该日志包含数百万行,因此regexp可能适用于此。
答案 0 :(得分:3)
如果您确定它始终是第3个单词(正如您所说),那么您可能根本不需要正则表达式。您可以通过简单的拆分来获取第三个单词。
然而,有人问过:Regular expression to match DNS hostname or IP Address? ...
答案 1 :(得分:3)
正如其他人所指出的,你不需要正则表达式。您也不应该使用String.split,因为它也使用正则表达式。您可以使用StringTokenizer。假设您使用BufferedReader br读取每一行:
String line = br.readLine();
StringTokenizer st = new StringTokenizer(line, " ");
st.nextToken();
st.nextToken();
String ip = st.nextToken();
答案 2 :(得分:0)
这是一个解决方案:
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细分:
\S+
,一个或多个非空白字符。\s+
,一个或多个空白字符。(\\S+)
在第1组中捕获的一个或多个非空白字符。答案 3 :(得分:0)
访问日志文件的格式始终取决于配置文件设置。最好不要假设IP地址是第三个“字”,而是读取当前配置文件并相应地将访问日志文件解析为LogFormat
条目。
Apache httpd根据 httpd.conf 和Tomcat运行到 server.xml 。 server.xml是一个XML文件,它使AccessLogValve成为标准过程。
这是一个更多的工作,但它将使您的应用程序更灵活,以防必须坚持。对于这种方法,我认为,字符串方法比正则表达式更容易使用。