繁体   English   中英

使用Java从日志中提取特定模式

[英]Extracting certain pattern from log using 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它是我在以上代码中以字符串形式读取的日志文件。

我的建议..

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;
            }
        }
    }

这是我的建议:

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

    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

因此,分解正则表达式:

首先,它跳过所有符号,直到找到第一个“ NodeName> command”,然后是一个数字。 我们想要保留此数字,以了解哪个命令创建了输出。 接下来,获取以下所有符号,直到(使用超前方式)找到另一个NodeName或输入的结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM