
我正在使用 -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]*$'