Terminal
如何 grep 實時日誌(標準輸出)?
我不確定這是否是標準輸出,但這就是我的想法。
我想要做的是在執行執行檔時過濾掉某個日誌消息。
我試過這個:
Executable 2>&1 /dev/null | grep -v "fixme:quartz:Parser_OutputPin_QueryInterface No interface for {56a868a5-0ad4-11ce-b03a-0020af0ba770}!"
和一個正常的:
Executable | grep -v "fixme:quartz:Parser_OutputPin_QueryInterface No interface for {56a868a5-0ad4-11ce-b03a-0020af0ba770}!"
但是終端仍然充滿了成千上萬的
fixme:quartz
消息。
首先,您需要確定您想要的消息是發送到 stdout 還是 stderr。在您的第一個範例中,您已將 stderr 重定向到 stdout - 這是“2>&1”部分。您在命令行上也有“/dev/null”,這並不完全有意義。為什麼“/dev/null”出現在命令行上?
其次,您需要決定要查看哪些消息。“-v”標誌
grep
將反轉匹配 - 只有與您的模式字元串不匹配的行才會被列印。您指定的模式非常精確:您可能需要嘗試一個不太具體的模式,例如'fixme:quartz'
,由於它的長度較短,將導致grep -v
不匹配更多行。如果我是你,我會做這樣的事情:
Executable > log 2> err
這將 stdout 和 stderr 分成兩個不同的文件。如果我想找到字元串“fixme:quartz”,我會這樣做:
grep 'fixme:quartz' log grep 'fixme:quartz' err
決定查看哪個文件,然後使用支持正則表達式(如
vim
)的文本編輯器來查找我想要的文件。如果這不起作用,或者如果
Executable
應該執行很長時間,並且您只想查看特定消息,請執行上述過程,並使用 確定您的正則表達式,並確定vim
該消息是在 stdout 還是 stderr 上。然後你可以這樣做:Executable > log 2> err tail -f log | grep 'fixme:quartz' # or whatever regular expression
在
Executable
執行並產生消息時,tail -f
會定期從文件“log”中讀取它們並列印到它自己的標準輸出,在那裡grep
將為您過濾。