我需要在'错误:'之前找到'get'(get zzzz)的最新出现:
。GET xxxxx
GET yyyyy
GET zzzzz
Some text
more text
error: this is an error
可以做到吗?
编辑
谢谢,尴尬解决方案有效,但是可以通过最后一次出现"错误:?
来进一步改善这一点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
这假设只能打印 1 块,并且还应打印error:
行。(更新:有关仅打印 last 块的解决方案)。
-
/^GET/ { delete lines; c=0; inBlock=1 }
在线路开始时遇到字符串GET
时,在变量lines
中开始构建一条线数。 -
/^error:/ { for(i=1; i<=c; ++i) print lines[i]; print; exit }
在行的开头匹配字符串error:
,并打印出到目前为止构建的所有行,然后是当前行,然后退出。 -
inBlock { lines[++c] = $0 }
从最新的GET
行添加到数组。
根据OP的请求:
更新:
报告(仅)以 error:
结尾的最后一个块,请使用以下内容:
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
块中进行打印。
给定:
$ echo "$tgt"
first line
second line
GET xxxxx
GET yyyyy
GET zzzzz
Some text
more text
error: this is the first error
GET xxxxx
GET yyyyy
GET zzzzzLAST
Some text
more text
error: this is the last error
last line
您可以拥有一个多行的正则等级,它将丢弃所有字符,直到这样的最后一个所需的块如此:
/^.*^(GET.*^error[^n]*)/ms
演示
现在使用perl,读取整个文件并与之匹配。-0777
命令行选项将导致整个文件读取:
$ echo "$tgt" | perl -0777 -ne 'print $1 if m/^.*^(GET.*^error[^n]*)/sm'
GET zzzzzLAST
Some text
more text
error: this is the last error
如果要在最后的"错误"行之外包含行,请将正则更改为:
/A.*^(GET.*^error.*)Z/ms
演示
在perl中:
$ echo "$tgt" | perl -0777 -ne 'print $1 if m/A.*^(GET.*^error.*)Z/ms'
GET zzzzzLAST
Some text
more text
error: this is the last error
last line
我设法获得了理想的结果,以下regexp:
(GET[^n]+n(?!GET).*)error:
您可以在http://regexpal.com/上进行测试。匹配所有模式。