2012-11-01 55 views
1

对不起,我的英语不好。JAVA - 网络日志文件

我有一个120,000行Web服务器的日志文件。输入文件的

实施例:

10.160.0.10; 16.11.2011十二时56; /; - ; “的Mozilla/5.0(Windows NT的5.1; RV:2.0)Gecko的/ 20100101火狐/ 4.0” 10.160 .0.100; 14.11.2011 7:22; /; - ;“Mozilla/5.0(Windows NT 5.1; rv:2.0)Gecko/20100101 Firefox/4.0” 10.160.0.100; 14.11.2011 10:45; /; - ; “Mozilla/5.0(Windows NT 5.1; rv:2.0)Gecko/20100101 Firefox/4.0” 10.160.0.100; 14.11.2011 10:53; /; - ;“Mozilla/4.0(compatible; MSIE 8.0; Windows NT 5.1;三叉戟/ 4.0)”

我需要在第一线与IP在第二行 和比较的IP地址同时 将包含Web浏览器版本的最后一个框与第二行中的版本进行比较。 并与第三行第二行等等

如果第一IP是相同第二IP和在一起的第一版本是相同第二版本 然后添加对的行信息例如#1的端部(将要意味着它是第一个用户)

如果IP或版本不同,则添加到第2行(第二个用户)的末尾。

它根据IP地址和用户代理字段的用户(基于不同版本的网络浏览器)。输出中文件的

实施例:

10.160.0.10; 16.11.2011十二时56; /; - ; “的Mozilla/5.0(Windows NT的5.1; RV:2.0)Gecko的/ 20100101火狐/ 4.0”;# 1 10.160.0.100; 14.11.2011 7:22; /; - ; “的Mozilla/5.0(Windows NT的5.1; RV:2.0)Gecko的/ 20100101火狐/ 4.0” #2 10.160.0.100; 14.11.2011 10: 45; /; - ;“Mozilla/5.0(Windows NT 5.1; rv:2.0)Gecko/20100101 Firefox/4.0”;#2 10.160.0.100; 14.11.2011 10:53; /; - ;“Mozilla/4.0兼容; MSIE 8.0; Windows NT的5.1;三叉戟/ 4.0)“;#3

你有任何想法如何做到这一点?

使用哪种方法?

谢谢你的帮助。

+1

查找 “正则表达式”。这是做到这一点的一种方法。 - 这将是我的首选方式 – DThought

+0

不相关,但在像Perl这样的脚本语言中做这样的事情会很麻烦。大概有3-4行代码。 –

+1

我认为Microsoft Log Parser(http://technet.microsoft.com/en-us/scriptcenter/dd919274.aspx)将是这类工作的绝佳工具。 – Henrik

回答

2

这并不完整,也没有接近最佳的地方,但基本上是您需要的一切。

List list = new ArrayList(); 
Scanner in = new Scanner(file); 
while(in.hasNext()) { 
    String line = in.nextLine(); 
    String[] splitLine = line.split(";",5); 
    String identifier = splitLine[0] + splitLine[4]; 
    if(list.contains(identifier)) { 
     line = line + " #" + (list.indexOf(identifier) + 1)); 
    } 
    else { 
     line = line + " #" + (list.size() + 1); 
     list.add(identifier); 
    } 
    System.out.println(line); 
} 
+0

非常感谢,这对我非常有帮助。 – Majkl

0

String.split方法,使用;作为字符分割。

+0

将这种大小的字符串拆分可能会使应用程序内存不足。 – Henrik

+0

如果他逐行读取文件,则不需要。 – svz