Java 每隔5分钟使用grep分析日志文件

Java 每隔5分钟使用grep分析日志文件,java,shell,grep,Java,Shell,Grep,我使用trilead ssh2进行ssh连接,并在之前每5分钟解析一次日志文件 我使用以下语法:- grep '29/Jan/2018:[0-0][6-6]:[1-2][6-1]' /root/nohup.out>/tmp/nohup.txt 基本上,我正在构建一个android应用程序,它将每隔5分钟解析一次日志文件,并将其存储到/tmp/nohup.txt中,下载并解析日志文件以查找异常并向用户显示异常通知等 String parsingCommand="grep"+" ' "+d

我使用trilead ssh2进行ssh连接,并在之前每5分钟解析一次日志文件

我使用以下语法:-

grep '29/Jan/2018:[0-0][6-6]:[1-2][6-1]' /root/nohup.out>/tmp/nohup.txt
基本上,我正在构建一个android应用程序,它将每隔5分钟解析一次日志文件,并将其存储到/tmp/nohup.txt中,下载并解析日志文件以查找异常并向用户显示异常通知等

String parsingCommand="grep"+" ' "+day2+"/"+month2+"/"+year2+":"+"["+hour2/10+"-"+hour1/10+"]"+"["+hour2%10+"-"+hour1%10+"]"+":"+"["+minute2/10+"-"+minute1/10+"]"+"["+minute2%10+"-"+minute1%10+"]"+" ' "+"/root/nohup.out"+">"+"/tmp/nohup.txt"; 在这种情况下,分钟间隔为16-21分钟

我想我没有使用正确的正则表达式,因为

grep '29/Jan/2018:[0-0][6-6]:[1-2][1-6]' /root/nohup.out>/tmp/nohup.txt
它起作用了

任何帮助都将不胜感激。 尽管在stackoverflow中已经有这么多答案:


我会使用非捕获组和“或”:

您当前的解决方案还将获得06:11的条目,另一方面,将错过06:20的条目

在小组中加入日期会更好。否则,您可能会在午夜遇到问题:

egrep '(?:28/Jan/2018:23:59)|(?:29/Jan/2018:00:00)|(?:29/Jan/2018:00:01)|(?:29/Jan/2018:00:02)|(?:29/Jan/2018:00:03)' ...
您可以通过使用StringBuilder实现这一点:

public String getGrepCommand(final Date start) {
    Calendar cal = Calendar.getInstance();
    StringBuilder bld = new StringBuilder();

    cal.setTime(start);
    for (int i = 0; i < 5; ++i) {
        bld.append("|(?:");
        bld.append(String.format("%1$td/%1$tb/%1%tY:%1$tH:%1$tM", cal.getTime()));
        bld.append(")");
        cal.add(Calendar.MINUTE, 1);
    }

    if (bld.length() > 0) { // should be ;)
        bld.delete(1, 1);
    }

    return bld.toString();

}
公共字符串getGrepCommand(最终日期开始){
Calendar cal=Calendar.getInstance();
StringBuilder bld=新的StringBuilder();
校准设定时间(开始);
对于(int i=0;i<5;++i){
bld.追加(“|(?:”);
bld.append(String.format(“%1$td/%1$tb/%1%tY:%1$tH:%1$tM”,cal.getTime());
bld.追加(“)”;
计算添加(日历分钟,1);
}
如果(bld.length()>0){//应该是;)
bld.删除(1,1);
}
返回bld.toString();
}
用于以下输入:

  2018-01-29 08:00:30,393  
  2018-01-29 08:02:00,003   
  2018-01-29 08:03:00,210 
  2018-01-29 08:01:00,401  
  2018-01-29 08:01:00,401  
  2018-01-29 08:05:00,401   
  2018-01-29 08:16:00,002
  2018-01-29 08:17:00,002
  2018-01-29 08:18:00,002
  2018-01-29 08:19:00,002
  2018-01-29 08:20:00,002
  2018-01-29 08:21:00,002
如果尝试运行此正则表达式:

  2018-01-29 08:(0[0-4]|1[6-9]|2[0-1])

您将在5分钟内看到一个完美匹配。您必须使用or运算符进行多模式匹配。在构建正则表达式的过程中,您必须进行大量计算。为了节省这么多的精力,Daniel提供的解决方案适合您的需要

为什么要使用sed而不是grep。尝试使用sed-n'/2018-01-29 08:00:00/,/2018-01-29 08:02:00/p'example.log获取最后2分钟的日志。由于您在Android中使用它,您可以执行newDate()并从中减去5分钟,然后使用param1作为早期日期,param2作为当前日期将其传递给sed命令。您可以使用formatter根据应用程序在日志中使用的模式对其进行格式化。注意*在进行任何时间操作或格式化时,始终使用date.getTime()。我也尝试过使用sed,但日志文件不包含/2018-01-29 08:00:00 date sed现在将显示数据,如果sed-n'/2018-01-29 08:00:00/,/2018-01-29 08:02:00/p'。在sed的情况下,第一个字段(即2018-01-29 08:00:00)似乎是强制性的,必须出现在日志文件中,并且不包括最后一个字段。在我的情况下,第一个字段可能存在也可能不存在。我使用了这个白鹭“(?:22/Jan/2018:07:39)(?:22/Jan/2018:07:40)(?:22/Jan/2018:07:41)(?:22/Jan/2018:07:42)(?:22/Jan/2018:07:43)”nohup.out,它没有显示数据。我在这里附上我正在检查的日志文件的链接。请检查此文件:您正在使用“/”运算符,但未转义字符。试试(?:23\/Jan\/2018:06:15)|(?:23\/Jan\/2018:06:16)。谢谢-当然你是对的。打字太快;)我在grep中错过了-E!!!多么愚蠢的错误:)。grep-E“2018年1月22日:06:(4[6-9]| 5[0-1])”nohup.out>/home/himanshu/Desktop/nohup.txt。它现在显示日期06:46-51分钟。日志文件url:=
  2018-01-29 08:00:30,393  
  2018-01-29 08:02:00,003   
  2018-01-29 08:03:00,210 
  2018-01-29 08:01:00,401  
  2018-01-29 08:01:00,401  
  2018-01-29 08:05:00,401   
  2018-01-29 08:16:00,002
  2018-01-29 08:17:00,002
  2018-01-29 08:18:00,002
  2018-01-29 08:19:00,002
  2018-01-29 08:20:00,002
  2018-01-29 08:21:00,002
  2018-01-29 08:(0[0-4]|1[6-9]|2[0-1])