追蹤日誌檔案但僅顯示特定行

追蹤日誌檔案但僅顯示特定行

我正在使用 -f 標誌追蹤日誌檔案。然後我將其通過管道傳遞給 grep,以僅查找包含“X”的行。這工作得很好。現在我想再次將其傳輸到另一個 grep 中,這將刪除所有包含“Y”的行。當我新增第二個管道時,檔案停止刷新,看起來沒有資料傳入。

這是有效的命令: tail -f my_file.log | grep "X"

這是不執行以下操作的命令: tail -f my_file.log | grep "X" | grep -v "Y"

我應該如何構建它以便該命令起作用?

答案1

當 的輸出grep被緩衝時,使用--line-buffered選項grep來啟用行緩衝:

tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'

如果您grep沒有該選項,您可以使用stdbuf以下替代方案:

tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'

答案2

我通常發現awk這些邏輯檢查更有用:

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

透過有兩個選項卡進行測試,其中一個選項卡是我繼續寫的seq 20 >> myfile,另一個選項卡上有例如tail -f myfile | awk '/3/ && !/13/'.

答案3

另一種方法是使用一次grep調用而不是兩次調用,從而避免緩衝問題。只需使用正規表示式來匹配由 0 個或多個非 Y 字元組成的行,然後是一個 X,然後再次匹配 0 個或多個非 Y,直到該行的末尾”

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'

相關內容