Bash 搜索一个字符串,并检索它后面的所有行,直到另一个特定模式

Bash 搜索一个字符串,并检索它后面的所有行,直到另一个特定模式,bash,scripting,sed,awk,grep,Bash,Scripting,Sed,Awk,Grep,在unix脚本中,我想在文本文件中搜索字符串,然后返回模式后面的所有行,直到一行包含单词“Failed” 比如说, Test Case Name "Blah" Error 1 Error 2 Error 3 Failed Test Case Name "Foo" Pass Test Case Name "Red" Pass 在上面,我想搜索“Blah”,然后返回: Error 1 Error 2 Error 3 直到行“失败”。“Blah”和“Failed”之间可以有任意数量的“Error”

在unix脚本中,我想在文本文件中搜索字符串,然后返回模式后面的所有行,直到一行包含单词“Failed”

比如说,

Test Case Name "Blah"
Error 1
Error 2
Error 3
Failed
Test Case Name "Foo"
Pass
Test Case Name "Red"
Pass
在上面,我想搜索“Blah”,然后返回:

Error 1
Error 2
Error 3
直到行“失败”。“Blah”和“Failed”之间可以有任意数量的“Error”行

任何使用sed、awk等的解决方案都是可以接受的


谢谢

以下是awk版本:

$ awk '/Failed/{p=0}p;/Blah/{p=1}' file
Error 1
Error 2
Error 3
如果你不介意打印边界线,你可以这样做

awk '/Blah/,/Failed/' file

对其工作原理的一些解释:awk脚本本质上是一系列具有结构
filter{actions}
的块,其中filter定义将应用哪些输入记录的操作

因此,第一个块
/Failed/{p=0}
表示,如果我们找到一个包含正则表达式
Failed
的记录,我们将变量
p
设置为零

第二块
p使用默认操作,即打印当前记录。因此,对于读取的每个记录,脚本检查
p
变量的值,如果
p
具有非零值(相当于真实条件),则打印该记录

第三个块
/Blah/{p=1}
表示,如果我们找到包含正则表达式
Blah
的记录,则将变量
p
设置为1

因此,如果我们将它们放在一起,脚本开始读取所有输入行而不打印它们(因为
p
的初始值为零)。找到包含
Blah
的记录后,将打印以下记录,直到找到包含
失败的记录。由于按照每个记录出现的顺序检查块,因此三个块的顺序将决定边界记录的情况。例如,如果要打印边界线,我们可以将脚本编写为
awk'/Blah/{p=1}p/失败/{p=0}'文件


第二个命令
awk'/Blah/,/Failed/“file
使用范围构造(逗号)。range构造的操作在这里有很好的说明:

这可能适合您:

sed -n '/Blah/,/Failed/{//!p}' file

是否不包括输出中的行
失败
?如果要搜索的一个有
Pass
怎么办?理想情况下,我希望没有“失败”,但我可以解决它。如果一个人有“通过”,它将只是一行(没有别的),但我已经注意到了一些简单的变化。也可能将
/Blah/
更改为
/^测试用例名称“Blah”/
,将
/Failed/
更改为
/^ Failed/
,使其更加具体,但这只是一个选项。也许已经够了。嗨,user000001!如果你能解释每个参数的确切含义,那就太好了。@AnandBuilders:我做了一个编辑来解释它是如何工作的。如果还有什么东西没有清理,请告诉我。它很好用。我还有一个顾虑,那就是我正在使用shell变量。因此,当我用shell变量替换blah时,它失败了。作为shell的新手,有什么帮助吗?@AnandBuilders:像这样试试
awk-vstart=“$var1”-vend=“$var2””$0~end{p=0}p$0~start{p=1}文件
用于正则表达式匹配或
awk-v start=“$var1”-v end=“$var2”'$0==end{p=0}p$0==start{p=1}'文件
用于文本匹配。