awk '
/foo/ { save=1 }
/baz/ { p=1 }
/bar/ { if (p) { print out ORS $0; } p=0; save=0; out="" }
{ if (save) { if (out) { out = out ORS $0 } else { out = $0 } } }
' input
Начать сохранение строк, если мы видим /foo/; решить, стоит ли их печатать, если мы видим /baz/, и как только мы увидим /bar/, напечатать сохраненные строки, если мы увидели /baz/.
Я не могу найти более умного способа предотвратить появление пустой строки (ORS) в начале переменной "out" без ее ручного тестирования (как это делаю я).