[英]How to parse IP addresses from Apache Server Log?
我必须从apache日志中找到常见的IP地址。
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 [zh](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 [zh](Win98; I; Nav)“
如何使用Java中的正则表达式提取IP地址(即每行中的第3个字)? 另外,我还必须从中找到最常见的IP地址,以查找机械手访问权限。 该日志包含数百万行,因此regexp可能适用于此。
如果您确定它始终是第三个单词(如您所说),那么也许根本不需要正则表达式。 您可以通过简单的拆分来取第三个单词。
但是,已经有人问过: 正则表达式匹配DNS主机名还是IP地址? ...
正如其他人指出的那样,您不需要正则表达式。 您也不应该使用String.split,因为它也使用了正则表达式。 您可以改用StringTokenizer。 假设您使用BufferedReader br读取每一行:
String line = br.readLine();
StringTokenizer st = new StringTokenizer(line, " ");
st.nextToken();
st.nextToken();
String ip = st.nextToken();
这是一种解决方案:
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));
正则表达式细分:
\\S+
,一个或多个非空白字符。 \\s+
,一个或多个空格字符。 (\\\\S+)
组1中捕获的一个或多个非空白字符。 访问日志文件的格式始终取决于配置文件设置。 最好不要假设IP地址是第三个“单词”,而是读取当前配置文件并根据LogFormat
条目解析访问日志文件。
Apache httpd根据httpd.conf和Tomcat对server.xml进行操作 。 server.xml是一个XML文件,它使解析AccessLogValve成为标准过程。
这需要做更多的工作,但是如果需要保留,它将使您的应用程序更灵活。 我认为,对于这种方法,字符串方法将比正则表达式更易于使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.