2014-02-07 45 views
0

我正在尝试制作一个能够观看某些日志的脚本。我有一个请求日志与每个请求格式化这样的事情,GNU awk中的缓冲区记录

--- 
id=273482 
Result=Error 
--- 
id=342345 
Result=Success 
--- 

第二个日志,其中每行都有请求的ID。我需要实时观看请求日志并将其与第二个日志交叉引用。

tail -f requestLog | awk \"BEGIN { RS = \"---\" } /Error/\" | grep --line-buffered id | sed -u ... 

我尾-f requestLog,使用awk在“---”上拆分记录,然后grep出id行。然后,我将所有内容传递给sed -u以提取id和xargs,以便grep第二个日志中与坏请求相关的行。

问题是结果出来真的延迟了,因为某些东西(我认为awk)缓冲错误。我怎样才能使awk读取输入不间断,并在每次看到坏记录时刷新输出?顺便说一下,我使用的是GNU awk。

回答

2

GNU awk有一个fflush()您可以使用刷新缓冲区:

.. | awk 'BEGIN { RS = "---" } /Error/ { print; fflush(); }' | .. 

有了这个你行缓冲管道中的所有阶段。

如果在未来有不支持像AWK fflushgrep --line-bufferedsed -u,GNU的coreutils管道中的任何其他方案有一个更一般的stdbuf您可以用任何程序中使用:

.. | stdbuf -o 0 any_other_command | .. 
0

这里是修复

tail -f requestLog|awk 'BEGIN{RS="--*"}/Error/{split($1,a,"=");print a[2]}'