在bash中使用分隔符提取行集

在bash中使用分隔符提取行集,bash,Bash,我正在尝试提取bash中特定模式之间的一组行。 我的输入文件: ========= a b ven c d ========= abc def venkata sad dada ========= 我试图只提取两个===之间的行,其中包含中间的模式venkata。例如,上面的第二部分(abc…dada)。 我已经试过sed,但它并没有提供我所需要的东西 我尝试将此任务拆分为分别获取venkata上方和下方的行 使用sed-n-e'/=====,/venkata/p'从输入的开头开始,这不是我需

我正在尝试提取bash中特定模式之间的一组行。

我的输入文件:

=========
a
b
ven
c
d
=========
abc
def
venkata
sad
dada
=========
我试图只提取两个
===
之间的行,其中包含中间的模式
venkata
。例如,上面的第二部分(abc…dada)。

我已经试过sed,但它并没有提供我所需要的东西

我尝试将此任务拆分为分别获取
venkata
上方和下方的行

使用
sed-n-e'/=====,/venkata/p'
从输入的开头开始,这不是我需要的。

有什么想法吗

编辑:
=======
之间的行数可以是任意数,
venkata
可以是任意行,而不一定是中间
每行可以有多个单词、数字和符号。这只是一个样本

编辑2:接受的答案接近,但给出第一次匹配的输出。这不是我想要的。
根据该问题答案中的命令,它将在找到第一个
==
时设置标志。 我需要
=
就在
venkata
之前,这不一定是第一个匹配项。

这个答案不能帮助我解决问题

使用
gnu awk
您可以这样做:

awk -v RS='={2,}\n' -v ORS= '/venkata/' file

abc
def
venkata
sad
dada

如果您没有
gnu awk
,请使用:

awk '/={2,}/{if (s && data ~ /venkata/) printf "%s", data; s=1; data=""; next} s{data = data $0 RS}' file

使用
grep
可以实现相同的功能:

cat infile | grep -A 2 -B 2 "venkata"
选项
-A
-B
分别打印多个尾随行和前导行

正如@Jan Gassen所指出的,如果您希望在匹配图案的下方和上方有相同数量的线条,您可以通过以下方式使其更加简单:

cat infile | grep -C 2 "venkata"

或者更简单:
grep-c2“venkata”文件
如果你没有
gnuawk
那么使用:
awk'/={2,}/{If(s&&data~/venkata/)printf“%s”,data;s=1;data=“”;next}s{data=data$0rs}文件
我没有gnuawk,我尝试了相应的解决方案。但是没有成功。它没有归还任何东西。我不清楚尝试和调试给出的解决方案的逻辑。如果您有不同的样本数据,请编辑问题,我将进一步调查。是否有多个单词的行?是的,可能有多个单词。而且它不仅限于字母表,每行可以有字母表、数字、特殊字符或所有这些字符的组合。@VenkataKrishna:您是否检查了我在下面发布的
awk
解决方案?