使用sed实时解析maven输出

时间:2013-01-28 16:54:04

标签: parsing sed grep flush

我正在尝试解析我的mvn verify输出,只显示带有INFO标记的行。请注意,maven输出实时连接到stdout ,而不是批量输出。我不认为这是maven的问题。

起初我尝试用grep:

来做
$ mvn verify | grep INFO

但似乎没有实时输出线,因为我理解grep在输出之前缓冲它的线,所以我必须在每次刷新之间等待几秒钟,然后我同时打印几十行,不太方便。然后我想我会尝试使用sed。

根据此link,以下命令:

sed -n '/PATTERN/p' file
// is equivalent to 
grep PATTERN file

并根据此link,-l选项应强制sed在每个换行符后刷新其输出缓冲区。所以现在我正在使用这个命令:

 $ mvn verify | sed -ln -e '/INFO/p'

但我仍然得到与以前相同的结果,我每30秒左右就会获得大量的输出,我不知道我做错了什么。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

试试这个,如果你的grep支持它:

mvn verify | grep --line-buffered INFO

如果您在终端中执行此操作并且仍然看到缓冲结果,那么它可能比grep执行缓冲更早,但我不熟悉mvn。 (并且,是的,-l的{​​{1}}选项应该做同样的事情,所以问题可能是上游。)

答案 1 :(得分:1)

试试这一行:

mvn verify | while read line; do echo $line|grep INFO; done

答案 2 :(得分:0)

我发现问题是什么,我使用脚本为maven输出着色(参见here),实际上是那个缓冲管道输出的脚本。我忘了它,因为我用它作为别名,我想这是一个很好的教训,我将来不会轻易做出别名。无论如何,这是修复,我在sed调用的最后一行中将-e更改为-le

  mvn $@ | sed -e "s/\(\[INFO\]\ \-.*\)/${TEXT_BLUE}${BOLD}\1/g" \
               -e "s/\(\[INFO\]\ \[.*\)/${RESET_FORMATTING}${BOLD}\1${RESET_FORMATTING}/g" \
               -e "s/\(\[INFO\]\ BUILD SUCCESSFUL\)/${BOLD}${TEXT_GREEN}\1${RESET_FORMATTING}/g" \
               -e "s/\(\[WARNING\].*\)/${BOLD}${TEXT_YELLOW}\1${RESET_FORMATTING}/g" \
               -e "s/\(\[ERROR\].*\)/${BOLD}${TEXT_RED}\1${RESET_FORMATTING}/g" \
               -le "s/Tests run: \([^,]*\), Failures: \([^,]*\), Errors: \([^,]*\), Skipped: \([^,]*\)/${BOLD}${TEXT_GREEN}Tests run: \1${RESET_FORMATTING}, Failures: ${BOLD}${TEXT_RED}\2${RESET_FORMATTING}, Errors: ${BOLD}${TEXT_RED}\3${RESET_FORMATTING}, Skipped: ${BOLD}${TEXT_YELLOW}\4${RESET_FORMATTING}/g"

实际上这告诉sed在每个新行刷新它的输出,这就是我想要的。对不起,我没有找到更通用的其他解决方法。我尝试使用empty(请参阅man页面)和script,但这些解决方案都不适用于我。