0

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

起初我尝试用 grep 来做:

$ mvn verify | grep INFO

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

根据此链接,以下命令:

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

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

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

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

4

3 回答 3

1

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

mvn verify | grep --line-buffered INFO

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

于 2013-01-28T17:09:07.087 回答
1

试试这一行:

mvn verify | while read line; do echo $line|grep INFO; done
于 2013-01-28T21:03:55.070 回答
0

我发现了问题所在,我正在使用一个脚本来为 maven 输出着色(请参见此处),事实上,正是该脚本在管道中缓冲了输出。我忘了它,因为我用它作为别名,我想这是一个很好的教训,我以后不会那么容易别名了。无论如何,这是修复,我在 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 在每一行刷新它的输出,这正是我想要的。很抱歉,我没有找到另一个更通用的解决方法。我尝试使用(参见手册页)和脚本,但这些解决方案都不适合我。

于 2013-01-29T17:17:14.007 回答