实时日志检查管道尾部、grep 和 cut 的问题

实时日志检查管道尾部、grep 和 cut 的问题

我必须实时检查不断增长的日志,我发现了一个问题,这让我错过有些行(我无法确切理解是什么行)使用tail -for tailf, grepand cut

我使用它是grep因为我想过滤包含特定单词的行,然后cut -c -NUM因为有些行非常长,我不希望它们在我的终端窗口中换行。

这是一个最小的示例,其中我正在观看由以下内容组成的示例日志《第N行》行,过滤单词“线”,在这种情况下缺少所有行(显然^C是我杀死了该进程):

$ tail -n 3 -f log

13th line
14th line
15th line
^C

$ tail -n 3 -f log | grep --color=never 'line'

13th line
14th line
15th line
^C

$ echo $COLUMNS

100

$ tail -n 3 -f log | grep --color=never 'line' | cut -c -$COLUMNS

^C

注意出现这个问题仅与(tail -ftailf)grep结合cut。如果我不在管道的grep中间或cut末端使用,则不会丢失线路。如果我替换tail -ftailcat,没问题。你可以看到每一种可能的情况这个更长的例子

我使用的是 Ubuntu 13.04,GNU 核心工具( tail, cut) 版本 8.20 和GNU grep2.14.

答案1

您的示例的问题是在grep和之间进行缓冲cut。仅当缓冲区已满(在我的系统上为 4kB)时,数据才会沿着管道传递。

尝试添加--line-bufferedgrep使其在每一行之后刷新缓冲区。

相关内容