搜索字符串,并检索包含它的行以及跟随它的所有行,直到另一个特定模式

时间:2018-03-22 01:15:52

标签: linux bash awk sed

使用linux,我想在文本文件中搜索字符串Blah,然后返回包含字符串的整行和模式后面的所有行,直到包含单词{{1 }}

例如,

Failed

在上面,我想搜索" Blah",然后返回:

Test Case Name "Blah"
Error 1
Error 2
Error 3
Failed
Test Case Name "Foo"
Pass
Test Case Name "Red"
Pass

直到第Test Case Name "Blah" Error 1 Error 2 Error 3 行。可以有任何数量的"错误" FailedBlah之间的行。

跟进以加快速度

sed和awk选项都有效。

Failed

sed '/Blah/!d;:a;n;/Failed/d;ba' file

然而,我注意到虽然返回预期结果非常快,但退出需要很长时间。也许这些命令反复搜索awk '/Failed/{p=0}/Blah/{p=1}p;' file ,并且假设它只出现一次,它们会一直运行到文件结尾。 这不是什么大问题,但是我正在处理一个包含1000万行的文件,现在它的速度很慢。

有关如何在找到包含BlahBlah的行后退出的任何建议,我们将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:2)

使用sed:

sed '/Blah/,/Failed/!d;//{1!d;}' file
  • /Blah/:匹配BlahFailed
  • 的行
  • !d:不要删除以前的匹配行
  • //{1!d;}:来自与地址匹配的行(BlahFailed),请勿删除第一个1!d

答案 1 :(得分:2)

这可能适合你(GNU sed):

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

打印BlahFailed之间的行,除非该行包含Failed

    sed ':a;/Blah/!d;:b;n;/Failed/ba;bb' file

如果某行不包含Blah,请将其删除。否则,打印当前行并获取下一行(n)。如果此行包含Failed,则删除它并开始下一次迭代。否则,重复直到成功或文件结束。

如果第一个解决方案位于同一行,则会阻止BlahFailed的打印。第二种选择,允许这样做。

答案 2 :(得分:1)

你喜欢用awk吗? awk '/Failed/{p=0}/Blah/{p=1}p;' file会对你有用。