我正在尝试解析我的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秒左右就会获得大量的输出,我不知道我做错了什么。有人能指出我正确的方向吗?
答案 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,但这些解决方案都不适用于我。