【问题标题】:Parsing Log Files With grep for Every 5 minutes interval每隔 5 分钟使用 grep 解析日志文件
【发布时间】:2018-01-29 06:59:44
【问题描述】:

我正在使用 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+"]"+"["+小时2%10+"-"+小时1%10+"]"+":"+"["+分钟2/10+"-"+分钟1/10+"]"+"["+分钟2%10+"- "+minute1%10+"]"+" ' "+"/root/nohup.out"+">"+"/tmp/nohup.txt";

这里 minute1 = 从服务器获取的当前分钟 & minute2= 分钟减少了 5 分钟

grep '29/Jan/2018:[0-0][6-6]:[1-2][6-1]' /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 中已经有很多答案:-

grep last 2 minutes of log?

https://superuser.com/questions/439688/how-to-grep-a-log-file-within-a-specific-time-period

【问题讨论】:

  • 为什么使用 sed 而不是 grep。试试这个 sed -n '/2018-01-29 08:00:00/,/2018-01-29 08:02:00/p' example.log 来获取最后 2 分钟的日志。由于您在 Android 中使用它,您可以执行 newDate() 并从中减去 5 分钟,将其传递给 sed 命令,其中 param1 作为较早日期,param2 当前日期。您可以使用格式化程序根据您的应用程序在日志中使用的模式对其进行格式化。注意* 在对时间进行任何操作或格式化时,请始终使用 date.getTime()。
  • 我也尝试过使用 sed,但日志文件不包含 /2018-01-29 08:00:00 日期 如果 sed -n '/2018-01-29 08:00,sed 现在将显示数据: 00/,/2018-01-29 08:02:00/p' 。在 sed 的情况下,它似乎有第一个字段,即 2018-01-29 08:00:00 强制性的,并且必须存在于日志文件中,并且不包括最后一个字段。在我的情况下,第一个字段可能存在也可能不存在。

标签: java shell grep


【解决方案1】:

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

egrep '29/Jan/2018:(?:(?:06:16)|(?:06:17)|(?:06:18)|(?:06:19)|(?:06:20)|(?:06:21))' /root/nohup.out>/tmp/nohup.out

您当前的解决方案也会从 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();

}

【讨论】:

  • 我用过这个 egrep '(?: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 并且它没有显示数据。我在这里附上我正在检查它的日志文件的链接。请检查此文件:drive.google.com/open?id=1jYkf-bMtphkTO-CHqOfpinx-OCbwyU-r
  • 您正在使用 '/' 运算符而不转义字符。试试 (?:23\/Jan\/2018:06:15)|(?:23\/Jan\/2018:06:16)。
  • 谢谢 - 你当然是对的。打字太快;)
【解决方案2】:

对于以下输入:

  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 运算符进行多模式匹配。重建正则表达式的方式,您将不得不进行大量计算。为了节省这么多精力,丹尼尔提供的解决方案可以根据您的需要进行适当的调整。

【讨论】:

猜你喜欢
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2013-03-13
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多