2016-03-31 96 views
2

我有一个我正在使用的命令行程序,它记录到控制台。但是,对于一些错误的固件,它每1秒打印一次特定的错误。使用grep过滤命令输出

我该如何使用grep来过滤输出,以避免这一特定的错误行被记录到控制台?

确切的错误我想摆脱的是:

[1] [NTC] [NET] netcam_read_html_jpeg: Potential split boundary - 1447 chars flushed, 1 re-positioned 

如果我在它创建一个sh脚本出错的行,像这样:

#!/bin/sh 

echo "[1] [NTC] [NET] netcam_read_html_jpeg: Potential split boundary - 1447 chars flushed, 1 re-positioned" 
echo "testing" 

,然后运行它,如预期,输出是

[1] [NTC] [NET] netcam_read_html_jpeg: Potential split boundary - 1447 chars flushed, 1 re-positioned 
testing 

现在,如果我运行它使用grep -v到t RY省略这一行,像这样:

./script.sh | grep -v "[1] [NTC] [NET] netcam_read_html_jpeg: Potential split boundary - 1447 chars flushed, 1 re-positioned" 

输出仍然是:

[1] [NTC] [NET] netcam_read_html_jpeg: Potential split boundary - 1447 chars flushed, 1 re-positioned 
testing 

然而,如果我运行相同的脚本,这一次试图摆脱含testing行,像这样:

./script.sh | grep -v "testing" 

然后是,如所预期的输出:

[1] [NTC] [NET] netcam_read_html_jpeg: Potential split boundary - 1447 chars flushed, 1 re-positioned 

现在有什么错在这里?显然,我正在使用正确的命令,因为它在第二个示例中起作用。它只是不工作,省略我想要的实际行!

我错过了什么?

+0

请阅读https://stackoverflow.com/help/how-to-ask。还请显示您自己做出的任何尝试。在询问之前,您预计会做出一些尝试。 –

+0

@EtanReisner - 已更新的问题 –

+0

方括号是正则表达式元字符。他们的意思是一个人物类。它们与正常字符不匹配。你需要将它们转义(用'\\')或告诉grep使用固定模式(使用'fgrep'或'-F'标志到'grep')。 –

回答

2

我明白了!

打印到控制台的线路正在stderr上发送,所以grep甚至没有看任何东西。

我跑,使其工作的命令是:

sudo motion 2> >(grep -v "\[1\] \[NTC\] \[NET\] netcam_read_html_jpeg: Potential split boundary - 1447 chars flushed, 1 re-positioned" 1>&2) 
+0

这是一个解决方案。 'sudo motion 2>&1 | grep ...'也可以工作(不需要不太可移植的进程替换)。 –