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

时间:2016-06-24 09:17:16

标签: shell awk pipe tail

拥有日志文件,例如:

[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)“空行”之后,比方说,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 个答案:

答案 0 :(得分:3)

awk -F'[][\\- ,:]+' '1'

上述内容将拆分][-,:上的字段,以便每个字段都是如下所述:

[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=$3$4$5$6$7$8$9 }
                      prev + 2000 < curr { print "" } # Print empty line if two seconds 
                                                      # have passed since last record.
                                         { prev=curr } 1'

答案 1 :(得分:0)

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秒内没有输出;你可以更频繁地检查最后一行并保留时间戳;但这需要更多代码......
  • 这取决于所有线条都是独特的;这在你的情况下是合理的;因为你在每一行都有时间戳