在 `tail -f` 中自动插入空行

Auto-insert blank lines in `tail -f`

有一个日志文件,例如:

[DEBUG][2016-06-24 11:10:10,064][DataSourceImpl] - [line A...]
[DEBUG][2016-06-24 11:10:10,069][DataSourceImpl] - [line B...]
[DEBUG][2016-06-24 11:10:12,112][DataSourceImpl] - [line C...]

tail -f 实时监控下,是否可以自动插入(通过我们将通过管道传输到 tail 的命令)"blank lines" 之后,比方说, 2 秒不活动?

预期结果:

[DEBUG][2016-06-24 11:10:10,064][DataSourceImpl] - [line A...]
[DEBUG][2016-06-24 11:10:10,069][DataSourceImpl] - [line B...]
---
[DEBUG][2016-06-24 11:10:12,112][DataSourceImpl] - [line C...]

(因为连续2行之间有超过2秒的间隔)

tail 没有这个功能。如果你愿意,你可以实现一个程序或脚本来检查文件的最后一行;像(伪代码)

previous_last_line = last line of your file
while(sleep 2 seconds)
    {
    if (last_line == previous_last_line)
        print newline
    else
        print lines since previous_last_line
    }

两条备注:

  • 这将导致您在2秒内没有输出;您可以更频繁地检查最后一行并保留时间戳;但这需要更多代码...
  • 这取决于所有行都是唯一的;这对你来说是合理的;因为每一行都有时间戳
awk -F'[][\- ,:]+' '1'

以上将在 ][-,</code> 和 [=17= 上拆分字段], 这样每个字段如下所述:</p> <pre><code>[DEBUG][2016-06-24 11:10:10,064][DataSourceImpl] - [line A...] 22222 3333 44 55 66 77 88 999 ...

然后您可以连接一些字段并使用它来测量时差:

tail -f input.log | awk -F'[][\- ,:]+' '{ curr= }
                      prev + 2000 < curr { print "" } # Print empty line if two seconds 
                                                      # have passed since last record.
                                         { prev=curr } 1'