sed:仅搜索并打印匹配的模式

sed:仅搜索并打印匹配的模式

从 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.logsed -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,打印存储的Buildingp并将空格x更改回来。最后,直到空行为止的所有行都被p打印(空模式//与最后一个模式匹配,因此我们不需要重复它)。输出是:

[main] [INFO] Building junt-parent 1.0.0-SNAPSHOT 
Exception units:
 <failed units>
 <failed units>

如果这不是您想要的,请给出现实世界的例子。

相关内容