Resposta curta
O GNU Parallel possui um conjunto de boas opções que facilitam a execução de tais ações:
parallel --tagstring "{}:" --line-buffer tail -f {} ::: one.log two.log
A saída seria:
one.log: conteúdo de one.log aqui ...
one.log: conteúdo de one.log aqui ...
two.log: conteúdo de two.log aqui ...
two.log: conteúdo de two.log aqui ...
Mais explicações
- A opção
--tagstring=str
identifica cada linha de saída com a string str . Na parallel
página do manual :
--tagstring str
Marcar linhas com uma sequência. Cada linha de saída será anexada com
str e TAB (\ t). str pode conter cadeias de substituição como {}.
--tagstring é ignorado ao usar -u, --onall e --nonall.
Todas as ocorrências de {}
serão substituídas pelos argumentos de paralelo que, nesse caso, são nomes de arquivos de log; ie one.log
e two.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
ou tail -f two.log
) seria impressa se esse comando fosse concluído. Como tail -f
aguardará o crescimento do arquivo, é necessário imprimir a saída on-line, o que o --line-buffer
fará. Novamente na parallel
página do manual :
--line-buffer (teste alfa)
Saída do buffer em linha. --group manterá a saída
juntos por um trabalho inteiro. --ungroup permite que a saída se misture com
meia linha proveniente de um emprego e meia linha proveniente de
outro trabalho. - line-buffer se encaixa entre estes dois: GNU paralelo
imprimirá uma linha completa, mas permitirá misturar linhas de
trabalhos diferentes.
-v
opção (detalhada) da cauda. Isso pode não corresponder exatamente à sua pergunta, mas é um começo.