grep 具有不同上下文的多个模式

grep 具有不同上下文的多个模式

我有一个文件大致类似于

header_one
param1
param2
...

data_one
data1
data2
data3
data4
...

header_two
param1
param2
...

data_two
data1
data2
data3
data4

我想提取具有以下行的所有header块以及具有以下行的所有块,保持它们在文件中出现的顺序并丢弃其他所有内容。NdataM != N

如果M == N == 8我可以这样做

grep -A8 -E "header_|data_"

但是如果我想为每个模式提供不同的上下文怎么办?

答案1

使用 awk 的临时解决方案可能是这样的:

awk '/^header_/ {n=1+1} /^data_/ {n=1+2} n-- > 0; n == 0 {print "---"}' < file

n在匹配行上设置,并针对每行递减。当n为正值时,将打印这些行,并在每个块后添加一个分隔符。使用上述值,它将打印header_行加上下一行,以及data_行加上下一行两行。


如果上下文块可以重叠,则新值n将覆盖以前的值。为了防止这种情况,请添加条件来保护分配:

awk '/^header_/ {if (n < 2) n=2} 
     /^data_/   {if (n < 5) n=5}
     n-- > 0; n == 0 {print "---"}' < file

这应该可以更好地处理连续行中存在data_和 的情况。header_

答案2

我已经尝试使用下面的 sed 命令经测试它工作正常让我知道是否有任何困惑

sed -n -e  '/header_/,+1p' -e '/^data_/,+2p' filename

输出

header_one
param1
data_one
data1
data2
header_two
param1
data_two
data1
data2

相关内容