如何打印与块不匹配的行块

时间:2014-04-09 21:56:16

标签: linux

我有一个带调用堆栈的日志文件。我不想打印调用堆栈,但希望打印所有其他调用堆栈。 调用堆栈由空行分隔

我怎么能用grep / sed / awk做到这一点? 示例文件:

func1
func2
func3

func4
func5

func6
func7
func8
func9

我希望除callstack块之外的所有行都包含func4,func5。

期望的输出:

func1
func2
func3

func6
func7
func8
func9

我知道我想忽略的调用堆栈中最后一个函数的名称。因为我知道func5 谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

使用awk,您可以尝试使用

形式的内容
awk '/func4/ {x=1} !x{print} x&&/^\s*$/{x=0}' < logfile

这里的技巧是使用变量x来决定是否应该打印当前行。

如果我们只知道我们不想打印的块的最后一个函数(比如func5),我们可以在处理之前和处理之后反转输入:

tac logfile | awk '/func5/ {x=1} !x{print} x&&/^\s*$/{x=0}' | tac

答案 1 :(得分:0)

你的问题很多,但如果我理解你的话,听起来你想要一个反向的grep,grep -v。运行连续的管道,每个不需要的功能一个管道应该可以做到这一点:

cat logfile.log | grep -v func4 | grep -v func5