Existe uma ferramenta que recebe entradas de vários arquivos ou pipes e as grava no stdout, sem bloquear as leituras, de modo que as linhas de entrada individuais saiam intactas? Basicamente, quero multiplexar um monte de entradas em uma saída sem linhas duplas.
$ combine file1 <(prog2) ... > nice-output.txt
- Eu não me importo com a ordem da saída
- Não deve bloquear enquanto alguma entrada tiver dados
- Deve ser eficiente (ou seja, posso diminuir o voto do seu one-liner Perl;)
-L
para executar um comando e mesclar a saída com o fluxo atual e-a
gravar a saída em um arquivo. Eu vou procurar mais amanhã. Se você dá um exemplo mais detalhado Vou tentar trabalhá-lo no.Se os processos gravam as linhas em uma única
write
chamada, o que exige que os processos usem buffer de linha (geralmente desativado se a saída padrão não for um terminal), você pode apenas apontar todos eles para um canal.Se os processos apenas executam buffer de linha ao gravar em um terminal, a maneira mais fácil é usá-lo
script
. É um pouco desajeitado: só pode gravar em um arquivo.Se os programas escreverem linhas longas ou simplesmente não usarem buffer de linha, essa abordagem não funcionará. Você precisará de um programa coletor que leia e armazene em buffer as linhas de cada entrada separadamente e execute a sincronização nas terminações da linha. Não há utilitário padrão com essa funcionalidade. Eu segundo a sugestão de Caleb
multitail
.Aqui está um script Python que lê linhas produzidas por vários comandos e as cospe em sua saída padrão, sem quebrar uma linha. Eu não testei muito, então ressalte o usuário. Eu ainda não fiz comparações.
Uso da amostra:
fonte
Sim, o multitail parece vinculado à noção de "janela" como subconjunto de um terminal; Não consegui que ele funcionasse bem como um componente de pipeline.
Parece que nós temos que fazer isso nós mesmos racha juntas
Ahhh, isso foi bom.
(nota: é testado em cerca de dois conjuntos de entradas. os erros podem ou não existir)
fonte