Uma solução ad-hoc com o awk poderia ser algo assim:
awk '/^header_/ {n=1+1} /^data_/ {n=1+2} n-- > 0; n == 0 {print "---"}' < file
n é definido em linhas correspondentes e é decrementado para cada linha. As linhas são impressas quando n é positivo com um separador após cada bloco. Com os valores acima, seria impressa header_ linhas mais uma próxima linha e data_ linhas mais duas próximas linhas.
Se os blocos de contexto puderem se sobrepor, o novo valor de n substituirá o valor anterior. Para evitar isso, adicione condições para proteger as atribuições:
awk '/^header_/ {if (n < 2) n=2}
/^data_/ {if (n < 5) n=5}
n-- > 0; n == 0 {print "---"}' < file
Isso deve ser melhor para lidar com casos em que há data_ e header_ em linhas consecutivas.