Terminal

如何 grep 實時日誌(標準輸出)?

  • January 21, 2015

我不確定這是否是標準輸出,但這就是我的想法。

我想要做的是在執行執行檔時過濾掉某個日誌消息。

我試過這個:

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將為您過濾。

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