如何在特定时间段内 grep 日志文件

Ros*_*sdi 22 grep

我有一个日志文件,日志中的每一行都带有一个日期,如下所示:

2012-03-06 11:34:48,657 blah blah blah...

我如何创建grep这个文件并只获取从早上 8 点到晚上 11 点的行?

我的意图是我想计算上午 8 点到晚上 11 点之间发生的错误数量。

use*_*686 26

egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'
Run Code Online (Sandbox Code Playgroud)

详细解释可以在各种regex(正则表达式)教程中找到;egrep使用“POSIX 扩展”语法 ( man 7 regex)。

  • 第一个^意思是“行的开始”。

  • [^ ]+ 只匹配日期字段,而不管实际日期。

    • [...]表示“括号之间的任何字符”,因此[89]将匹配89; [0-9]是任何数字,并且[^ ]空格之外的任何数字(因为有^括号)。

    • +指“一个或多个先前的”(例如,a+将匹配aaaaaaaaaaaa)。

    • 所以^[^ ]+将从行的开头开始,并尽可能多地匹配非空格字符。

  • (...|...|...)表示“给定模式中的任一个”,因此(0[89]|1[0-9]|2[012])表示“要么0[89]1[0-9]要么2[012]”。它将匹配从 08 到 22 的所有数字。


一个更好的选择是:

awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'
Run Code Online (Sandbox Code Playgroud)

-F选项根据[: ]正则表达式(匹配任一:或空格)将每一行拆分为单独的字段,并且awk脚本检查第二列(小时)。


Nim*_*a G 23

为什么要费心使用grep?您可以简单地使用 sed。

例子:

sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log
Run Code Online (Sandbox Code Playgroud)

这将打印June 17 13:39:54和之间的所有日志June 18 10:50:28

  • 这种方法的问题在于日志文件中必须有一行带有该时间戳。在上面的例子中,如果没有时间戳为 2012-03-06 11:34:48 的行,则不会打印任何内容。上面的 awk 方法适用于这种情况(即,您希望所有日志的小时数在 8 到 11 之间,但您不知道在 2012-03-06 08:00:00 或任何时间是否有日志条目小时)。 (2认同)