Existem dois problemas com sua primeira tentativa. {.*} contém caracteres especiais que precisam ser protegidos da expansão pelo shell; Coloque aspas ao redor do padrão. Além disso, {.*} corresponde ao texto mais longo delimitado por chave na linha, portanto, se você tiver uma linha contendo hello {test1} world {test2} howdy , a saída será {test1} world {test2} , porque .* correspondido test1} world {test2 .
O seguinte mostrará apenas o que está entre parênteses.
grep -o -e "{[^}]*}"
Minha formulação original usava "{. *}", mas com isso o maior suporte encontrado dentro de uma linha, não o menor, seria retornado ...