Grep

實時日誌檢查管道尾部、grep 和 cut 的問題

  • July 4, 2013

我必須實時檢查不斷增長的日誌,我發現了一個問題,使用tail -for和.tailf``grep``cut

我使用grep是因為我想過濾包含特定單詞的行,然後cut -c -NUM因為有些行很長,我不希望它們在我的終端視窗中換行。

這是一個最小的範例,其中我正在觀看由*“Nth line”行組成的範例日誌,過濾單詞“line”*,在這種情況下缺少所有行(顯然^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(or tailf)grepcut組合. 如果我不在grep中間或cut管道末端使用,則不會缺少行。如果我tail -ftailor替換cat,沒問題。您可以在這個較長的範例中看到所有可能的情況。

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

grep您的範例的問題是在和之間進行緩衝cut。只有當緩衝區已滿(我的系統上為 4kB)時,數據才會沿管道傳遞。

嘗試添加--line-bufferedgrep使其在每行之後刷新緩衝區。

引用自:https://unix.stackexchange.com/questions/81725