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

lor*_*o-s 3 grep logs tail cut

我必须检查不断增长的日志实时,我发现,这让我的问题会错过一些线路使用(我不能什么不懂行)tail -f或者tailfgrepcut

我使用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
Run Code Online (Sandbox Code Playgroud)

请注意,此问题tail -ftailfgrepcut出现(或)组合. 如果我不在管道grep中间或cut末端使用,则不会丢失线。如果我tail -ftail或替换cat,没问题。在这个较长的示例中,您可以看到所有可能的情况。

我使用的是 Ubuntu 13.04、GNU coreutils ( tail, cut) 8.20 版和GNU grep 2.14。

Dav*_*man 6

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

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

  • 缓冲是 libc 的标准行为,它不特定于 `grep`。默认情况下,终端的输出是行缓冲的,并且每行都被刷新。否则,输出将被完全缓冲。这包括管道到另一个命令,将输出重定向到未附加到终端的文件和/或进程(例如 cron 作业)。 (3认同)