Grep
實時日誌檢查管道尾部、grep 和 cut 的問題
我必須實時檢查不斷增長的日誌,我發現了一個問題,使用
tail -f
or和.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
(ortailf
)grep
和cut
組合. 如果我不在grep
中間或cut
管道末端使用,則不會缺少行。如果我tail -f
用tail
or替換cat
,沒問題。您可以在這個較長的範例中看到所有可能的情況。我使用的是 Ubuntu 13.04、GNU coreutils (
tail
,cut
) 版本 8.20 和GNU grep 2.14。
grep
您的範例的問題是在和之間進行緩衝cut
。只有當緩衝區已滿(我的系統上為 4kB)時,數據才會沿管道傳遞。嘗試添加
--line-buffered
以grep
使其在每行之後刷新緩衝區。