从特定行号拖尾日志文件

Mol*_*pad 3 bash tail less-unix

我知道如何使用特定行数来拖尾文本文件,

tail -n50 /this/is/my.log
Run Code Online (Sandbox Code Playgroud)

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

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

Day Mon YY HH:MM:SS
Run Code Online (Sandbox Code Playgroud)

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

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

那可能吗?

Gem*_*lor 5

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

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

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

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

grep "^`date -d yesterday '+%d %b %y'`" -A1000000 log_file.txt
Run Code Online (Sandbox Code Playgroud)

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

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

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