如何 grep 实时日志(标准输出)?

如何 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等消息。

答案1

首先,您需要查明您想要的消息是否发送到 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将定期从文件“日志”中读取它们并打印到其自己的标准输出,其中grep将为您进行过滤。

相关内容