我需要在’error:’之前找到最近出现的’GET'(GET zzzz)并捕获其间的所有文本.
GET xxxxx GET yyyyy GET zzzzz Some text more text error: this is an error
可以这样做吗?
编辑
谢谢,awk解决方案有效,但是通过最后出现’错误:’可以进一步改善吗?
GET xxxxx GET yyyyy GET zzzzz Some text more text error: this is the first error GET xxxxx GET yyyyy GET zzzzz Some text more text error: this is the last error
解决方法
尝试以下awk解决方案:
awk ' /^GET/ { delete lines; c=0; inBlock=1 } /^error:/ { for(i=1; i<=c; ++i) print lines[i]; print; exit } inBlock { lines[++c] = $0 } ' file
这假设必须只打印一个块,并且还应打印错误:行. (更新:请参阅下面的解决方案,仅打印最后一个块).
> / ^ GET / {删除行; C = 0;每当在行的开头遇到字符串GET时,inBlock = 1}开始在可变行中构建一个行数组.
> / ^错误:/ {for(i = 1; i< = c; i)print lines [i];打印; exit}匹配字符串错误:在行的开头打印出到目前为止构建的所有行,然后是当前行,然后退出.
> inBlock {lines [c] = $0}将从最近的GET行开始的每一行添加到数组中.
根据OP的要求更新:
要(仅)报告以错误:结尾的最后一个块,请使用以下命令:
awk ' /^GET/ { delete lines; c=0; inBlock=1 } inBlock { lines[++c] = $0 } /^error:/ { inBlock=0; } END { for(i=1; i<=c; ++i) print lines[i] } ' file
这与第一个解决方案的不同之处在于后面的块只是简单地替换了之前的块,因此最后一个块“wins”,然后在Awk脚本的END块中处理完所有输入之后打印.