![实时日志检查管道尾部、grep 和 cut 的问题](https://linux22.com/image/33726/%E5%AE%9E%E6%97%B6%E6%97%A5%E5%BF%97%E6%A3%80%E6%9F%A5%E7%AE%A1%E9%81%93%E5%B0%BE%E9%83%A8%E3%80%81grep%20%E5%92%8C%20cut%20%E7%9A%84%E9%97%AE%E9%A2%98.png)
我必须实时检查不断增长的日志,我发现了一个问题,这让我错过有些行(我无法确切理解是什么行)使用tail -f
or tailf
, grep
and 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 -f
或tailf
)grep
结合cut
。如果我不在管道的grep
中间或cut
末端使用,则不会丢失线路。如果我替换tail -f
为tail
或cat
,没问题。你可以看到每一种可能的情况这个更长的例子。
我使用的是 Ubuntu 13.04,GNU 核心工具( tail
, cut
) 版本 8.20 和GNU grep2.14.
答案1
您的示例的问题是在grep
和之间进行缓冲cut
。仅当缓冲区已满(在我的系统上为 4kB)时,数据才会沿着管道传递。
尝试添加--line-buffered
以grep
使其在每一行之后刷新缓冲区。