ao seguir vários arquivos de uma vez, como mostrado abaixo, existe alguma maneira de mostrar o nome do arquivo no início de cada linha?
tail -f one.log two.log
saída atual
==> one.log <==
contents of one.log here...
contents of one.log here...
==> two.log <==
contents of one.log here...
contents of two.log here..
Procurando algo como
one.log: contents of one.log here...
one.log: contents of one.log here...
two.log: contents of two.log here...
two.log: contents of two.log here...
-v
opção (detalhada) da cauda. Isso pode não corresponder exatamente à sua pergunta, mas é um começo.Respostas:
\ obrigado {don_cristti}
fonte
awk
solução mágica joojoo funciona!Resposta curta
O GNU Parallel possui um conjunto de boas opções que facilitam a execução de tais ações:
A saída seria:
Mais explicações
--tagstring=str
identifica cada linha de saída com a string str . Naparallel
página do manual :Todas as ocorrências de
{}
serão substituídas pelos argumentos de paralelo que, nesse caso, são nomes de arquivos de log; ieone.log
etwo.log
(todos os argumentos depois:::
).A opção
--line-buffer
é necessária porque a saída de um comando (por exemplo,tail -f one.log
outail -f two.log
) seria impressa se esse comando fosse concluído. Comotail -f
aguardará o crescimento do arquivo, é necessário imprimir a saída on-line, o que o--line-buffer
fará. Novamente naparallel
página do manual :fonte
Se
tail
não for obrigatório, você pode usargrep
para fazer isso:Isso imprimirá o nome do arquivo como o prefixo de cada linha de saída.
A saída é interrompida se for
*.log
expandida para apenas um arquivo. A respeito disso:fonte
tail -f
nãogrep
.--with-filename
ou-H
forçar sempre a pré-inclusão de nome de arquivo.awk
solução complicada ouparallel
que não está instalada.Minha idéia seria criar um único arquivo com logs mesclados de vários arquivos, como alguém sugerido aqui e anexar nomes de arquivos:
fonte
Algo com
xargs
esed
poderia funcionar:fonte