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.