首页 > 解决方案 > 从特定行号跟踪日志文件

问题描述

我知道如何尾随特定行数的文本文件,

tail -n50 /this/is/my.log

但是,如何使该行计数成为变量?

假设我有一个大型日志文件,该文件每天由某个程序附加,日志文件中的所有行都以这种格式的日期时间开头:

Day Mon YY HH:MM:SS

每天我都想输出日志文件的尾部,但只输出前几天的记录。假设这个输出在午夜之后运行,我不担心尾巴会溢出到第二天。

我只是希望能够根据昨天日期的第一次出现来计算出要尾随的行数......

那可能吗?

标签: bashtailless-unix

解决方案


回答标题问题,对于任何以这种方式来到这里的人来说,head 和 tail 都可以接受一个代码,用于排除文件的多少。

  • 对于tail,-n +num用于行号num开始于
  • 对于head,-n -num用于不打印的行数

如果您记住了上次执行命令时的行数,那么这与实际问题相关,然后使用该数字tail -n +$prevlines来获取部分日志的下一部分,无论检查日志的频率如何。

回答实际问题,在您可以 grep 的特定行之后打印所有内容的一种方法是使用 -A 带有荒谬计数的选项。这可能比此处的其他答案更有用,因为您可以获得数天的结果。因此,要获取昨天和今天到目前为止的所有内容:

grep "^`date -d yesterday '+%d %b %y'`" -A1000000 log_file.txt

您可以组合 2 个 grep 在 2 个日期范围之间打印。

请注意,这取决于日志文件中实际发生的日期。它的弱点是,如果在用作范围标记的特定日期没有记录任何事件,那么它将无法找到任何东西。

要解决这个问题,您可以为开始日期和结束日期注入虚拟记录,并在 grepping 之前对文件进行排序。不过,这可能有点矫枉过正,而且排序可能很昂贵,所以我不会举例。


推荐阅读