使用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
行。可以有任何数量的"错误" Failed
和Blah
之间的行。
跟进以加快速度
sed和awk选项都有效。
Failed
和
sed '/Blah/!d;:a;n;/Failed/d;ba' file
然而,我注意到虽然返回预期结果非常快,但退出需要很长时间。也许这些命令反复搜索awk '/Failed/{p=0}/Blah/{p=1}p;' file
,并且假设它只出现一次,它们会一直运行到文件结尾。
这不是什么大问题,但是我正在处理一个包含1000万行的文件,现在它的速度很慢。
有关如何在找到包含Blah
和Blah
的行后退出的任何建议,我们将不胜感激。
谢谢!
答案 0 :(得分:2)
使用sed:
sed '/Blah/,/Failed/!d;//{1!d;}' file
/Blah/
:匹配Blah
到Failed
!d
:不要删除以前的匹配行//{1!d;}
:来自与地址匹配的行(Blah
和Failed
),请勿删除第一个1!d
。答案 1 :(得分:2)
这可能适合你(GNU sed):
sed -n '/Blah/,/Failed/{/Failed/!p}' file
打印Blah
至Failed
之间的行,除非该行包含Failed
。
sed ':a;/Blah/!d;:b;n;/Failed/ba;bb' file
如果某行不包含Blah
,请将其删除。否则,打印当前行并获取下一行(n
)。如果此行包含Failed
,则删除它并开始下一次迭代。否则,重复直到成功或文件结束。
如果第一个解决方案位于同一行,则会阻止Blah
和Failed
的打印。第二种选择,允许这样做。
答案 2 :(得分:1)
awk '/Failed/{p=0}/Blah/{p=1}p;' file
会对你有用。