Com as ferramentas gnu , você pode usar uma única chamada de gawk :
awk '/pattern/{l=$0} ENDFILE{if (l) {print FILENAME ":" l; l=""}}' **/*.out
(se as correspondências de linha armazenarem em l ; no final de cada arquivo, se l não estiver vazio, nome do arquivo de impressão e l , então redefinir l )
ou sed :
sed -ns '/pattern/h;${x;//{F;p}}' **/*.out
(se a linha corresponder, copie para h old space; se la $ t line, e x change mantenha espaço w. pattern space; se corresponder, p rint F ile name e line)
embora a saída seja diferente - o nome do arquivo e a última linha correspondente correspondem a linhas separadas - mas se canalizado para outro sed , por exemplo,
sed -ns '/pattern/h;${x;//{F;p}}' **/*.out |sed '$!N;s/\n/:/'
ele imitará grep output 1 .
O acima assume bash (v. 4 com shopt -s globstar ) ou zsh . Para incluir arquivos ocultos, adicione shopt -s dotglob ( bash ) ou setopt dotglob ( zsh ).
1: desde que nenhum desses nomes de arquivo contenha caracteres de nova linha.