从 2 GB 的 Maven 构建日志文件中,尝试捕获异常及其相应的模块。日志文件的格式:
[main] [INFO] -------------< org.maven.plugins.junt:parent >-------------
[main] [INFO] Building junt-parent 1.0.0-SNAPSHOT
...........
...........
...........
...........
Exception units:
<failed units>
<failed units>
提出了以下选项,但两者都在比赛之前和之后打印附加行。不确定如何向上遍历并匹配已记录异常单元的模块。这两个匹配之间的行不是必需的,只需要异常单元及其失败的模块。
sed -n '/Exception units/,/^$/p' maven_build.log
也sed -n '/Building/,/Exception units/!p'
编辑:预期输出:
Building junt-parent 1.0.0-SNAPSHOT
Exception units:
<failed units>
<failed units>
答案1
从评论中我发现你实际上有一个这样的文件:
[main] [INFO] Building bar 1.0.0-SNAPSHOT
... Building ........
[main] [INFO] -------------< org.maven.plugins.junt:parent >-------------
[main] [INFO] Building junt-parent 1.0.0-SNAPSHOT
... Building ........
Exception units:
<failed units>
<failed units>
[main] [INFO] Building foo 1.0.0-SNAPSHOT
... Building ........
并且仅当有一行时Exception units:
您希望打印这些行直到空行,但在最后[main] [INFO] Building
一行之前,这样您就知道消息属于哪个模块。其他[main] [INFO] Building
无一例外都不应该打印吗?
在这种情况下,您可以将每一[main] [INFO] Building
行存储在保留空间中h
,以便您可以在需要时调用它:
sed -ne '/\[main] \[INFO] Building/h;/Exception units:/{x;p;x;}' -e '//,/^$/p'
如果Exception units:
找到该行,则更改空格x
,打印存储的Building
行p
并将空格x
更改回来。最后,直到空行为止的所有行都被p
打印(空模式//
与最后一个模式匹配,因此我们不需要重复它)。输出是:
[main] [INFO] Building junt-parent 1.0.0-SNAPSHOT
Exception units:
<failed units>
<failed units>
如果这不是您想要的,请给出现实世界的例子。