Uma maneira é usar sinalizadores e marcadores para acompanhar
$ awk '/b/{f=1; c=0} f; /d/ && ++c==2{f=0}' file.txt
b
c
d
e
f
d
-
/b/{f=1; c=0}
definir sinalizador para partida inicial e inicializar contador -
f;
imprime o registro de entrada quando o marcador longo é definido -
/d/ && ++c==2{f=0}
limpar o sinalizador se a string final for correspondida pela segunda vez - pode simplificar para
awk '/b/{f=1} f; /d/ && ++c==2{exit}'
se houver apenas um conjunto a ser extraído
Note que se a partida final não tiver 2 correspondências, ela será impressa até o final da entrada
$ seq 10 | awk '/4/{f=1; c=0} f; /6/ && ++c==2{f=0}'
4
5
6
7
8
9
10