Grep

使用 tail 時抑制“文件被截斷”消息

  • March 4, 2022

我正在使用一個日誌文件tail -f messages.log,這是輸出的一部分:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Fusce eget tellus sit amet odio porttitor rhoncus. 
Donec consequat diam sit amet tellus viverra pellentesque. 
tail: messages.log: file truncated
Suspendisse at risus id neque pharetra finibus in facilisis ipsum.

它顯示tail: messages.log: file truncated文件何時自動截斷並且應該發生,但我只想tail顯示沒有此截斷消息的輸出。

我已經嘗試過使用tail -f messages.log | grep -v truncated,但無論如何它都會向我顯示消息。

有什麼方法可以抑制這個消息嗎?

該消息像所有警告和錯誤消息一樣在stderr上輸出。

您可以刪除所有錯誤輸出:

tail -f file 2> /dev/null

或僅過濾掉包含以下內容的錯誤消息truncate

{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1

但是,這意味著您將失去tail. 一些 shell 有一個pipefail選項(使用 啟用),讓該管道在失敗set -o pipefail時報告退出狀態。並且還可以在其/數組中報告管道的各個組件的狀態。tail``zsh``bash``$pipestatus``$PIPESTATUS

使用zshor bash,您可以使用:

tail -f file 2> >(grep -v truncated >&2)

但請注意,grep不會等待該命令,因此tail退出後可能會顯示任何錯誤消息,並且 shell 已經開始執行腳本中的下一個命令。

zsh中,您可以通過編寫它來解決這個問題:

{ tail -f file; } 2> >(grep -v truncated >&2)

這在以下zsh文件中進行了討論info zsh 'Process Substitution'

還有一個問題>(PROCESS); 當它附加到外部命令時,父 shell 不會等待 PROCESS 完成,因此緊隨其後的命令不能依賴於完成的結果。問題和解決方案與註釋 Redirection::中的**MULTIOS部分中描述的相同。因此,在上述範例的簡化版本中:

paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)

(請注意,不涉及 MULTIOS),就父 shell 而言,PROCESS 將非同步執行。解決方法是:

{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)

這裡的額外程序是從等待它們完成的父 shell 產生的。

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