awk '/^###/{o=p;p="";getline};r&&!p{print substr(o,0,length(o)-1);exit};{p=p$0"\n"};/hledaný_výraz/{r=1}'
Důležité je, že v awk jsou proměnné netypové a dají se testovat a používat bez deklarace, prostě se při prvním použití samy vytvoří jako prázdné/nulové. Při použití ve stringu se bude taková proměnná chovat jako prázný řetězec, při výpočtech jako nula. Dokonce pokud bude v proměnné řetězec a vrazíte ji do matematického výrazu, bude se chovat jako nula.
Uvedený program dělá následující:
Do proměnné p si postupně načítá jednotlivé řádky souboru, které interpret awk drží vždy v proměnné $0, a odděluje je znakem nového řádku. {p=p$0"\n"}
Když narazí na řádek začínající ### odloží si obsah p (což je celý předešlý blok) do proměnné o, p smaže a načte nový řádek.
/^###/{o=p;p="";getline}
Pokud v daném bloku našel hledaný výraz, což indikuje neprázdná proměnná r ( /hledaný_výraz/{r=1} ) , a zároveň došel na konec bloku, což indikuje prázdná p, vytiskne celý blok odložený v proměnné o bez posledního znaku nového řádku a ukončí program.
r&&!p{print substr(o,0,(length(o)-1));exit}
Poskládané je to tak, aby se vyplivnul jen čistý blok, bez oddělovacích řádků.