O GNU grep tem a opção -P para as expressões regulares no estilo perl e a opção -o para imprimir apenas o que corresponde ao padrão. Eles podem ser combinados usando asserções de look-around (descritas em Extended Patterns no perlre manpage ) para remover parte do padrão grep do que é determinado que corresponde aos propósitos de -o .
$ grep -oP 'foobar \K\w+' test.txt
bash
happy
$
O \K é a forma abreviada (e mais eficiente) de (?<=pattern) que você usa como uma asserção de look-behind de largura zero antes do texto que deseja gerar. (?=pattern) pode ser usado como uma asserção de antecipação de largura zero após o texto que você deseja gerar.
Por exemplo, se você quisesse combinar a palavra entre foo e bar , você poderia usar:
$ grep -oP 'foo \K\w+(?= bar)' test.txt
ou (por simetria)
$ grep -oP '(?<=foo )\w+(?= bar)' test.txt