2012-09-10 19 views
0

我想从日志文件中提取一段信息。我正在使用的模式是节点名称和命令的提示。我想提取命令输出的信息并比较它们。考虑下面的示例输出使用Java从日志中提取某些模式

NodeName > command1 

    this is the sample output 

    NodeName > command2 

    this is the sample output 

我试过下面的代码。

public static void searchcommand(String strLineString) 
    { 


      String searchFor = "Nodename> command1"; 
      String endStr = "Nodename"; 
      String op=""; 
      int end=0; 
       int len = searchFor.length(); 
       int result = 0; 
       if (len > 0) { 
       int start = strLineString.indexOf(searchFor); 
       while(start!=-1){ 
     end = strLineString.indexOf(endStr,start+len); 

       if(end!=-1){ 
        op=strLineString.substring(start, end); 

       }else{ 
        op=strLineString.substring(start, strLineString.length()); 
       } 
       String[] arr = op.split("%%%%%%%"); 
       for (String z : arr) { 
        System.out.println(z); 
       } 

        start = strLineString.indexOf(searchFor,start+len); 


       } 

       } 



    } 

问题是代码太慢而无法提取数据。有没有其他方法可以这样做?

编辑1 它是一个日志文件,我在上面的代码中读取为一个字符串。

+0

你有整个日志作为一个字符串? –

+0

我读取文件作为上述代码的字符串。 –

+0

这样一个字符串有多大?你有没有测量需要时间?将日志读入一个字符串?寻找开始/停止或分裂?很难给出具体的解析优化,她的输入与代码不匹配。 –

回答

0

我的建议..

public static void main(String[] args) { 
     String log = "NodeName > command1 \n" + "this is the sample output \n" 
       + "NodeName > command2 \n" + "this is the sample output"; 

     String lines[] = log.split("\\r?\\n"); 
     boolean record = false; 
     String statements = ""; 
     for (int j = 0; j < lines.length; j++) { 
      String line = lines[j];   
      if(line.startsWith("NodeName")){ 

       if(record){ 
        //process your statement 
        System.out.println(statements); 
       } 

       record = !record; 
       statements = ""; // Reset statement 
       continue; 
      } 

      if(record){    
       statements += line; 
      } 
     } 
    } 
+0

或优化您的代码,您可以从strLineString变量中删除搜索到的字符串。在你重新分配开始的末尾,你写strLineString = strLineString.subString(end); start = 0; – bhatanant2

0

这里是我的建议:

使用正则表达式。这里是一个:

final String input = " NodeName > command1\n" + 
      "\n" + 
      " this is the sample output1 \n" + 
      "\n" + 
      " NodeName > command2 \n" + 
      "\n" + 
      " this is the sample output2"; 

    final String regex = ".*?NodeName > command(\\d)(.*?)(?=NodeName|\\z)"; 

    final Matcher matcher = Pattern.compile(regex, Pattern.DOTALL).matcher(input); 

    while(matcher.find()) { 
     System.out.println(matcher.group(1)); 
     System.out.println(matcher.group(2).trim()); 
    } 

输出:

1 
this is the sample output1 
2 
this is the sample output2 

因此,要打破正则表达式:

首先,它跳过所有的迹象,直到它找到的第一个 “节点名>命令”,然后由一个数字。我们想要保留这个数字,知道哪个命令创建了输出。接下来,我们抓住以下所有迹象,直到我们(使用lookahead)找到另一个NodeName或输入的结尾。