Combinando (multiplexando) pipes em um (linewise). Existe tal programa?

2

Já existe um programa que lê vários canais ou descritores de arquivos e grava na saída padrão (não em linhas de divisão).

Como cat , mas lendo todos os arquivos simultaneamente e preservando as linhas.

Algo como:

until(all fds are EOF) {
    select(multiple fds);
    read a line from triggered fd;
    write the line to the stdout;
}

É necessário evitar a codificação de loops de seleção / epoll ou o uso de multithreading em programas simples. Como "select loop for bash".

Atualização: eu também created uma pergunta semelhante no unix.SE.

    
por Vi. 23.02.2011 / 19:09

3 respostas

0

Criado um programa para fazer exatamente isso: fdlinecombine. Ele lê os descritores de arquivos especificados e gera os dados de forma linear.

Verificou alguns casos de canto, testou um pouco. Esperando que seja útil para alguém também.

    
por 04.12.2011 / 01:25
2

Uma solução parcial poderia ser usar:

tail -fq file1 file2 file3 | grep -v ^$ | yourprogram

Chamo isso de solução parcial porque o grep remove a linha vazia que tail adiciona toda vez que ele altera o arquivo. Se sua entrada contiver linhas vazias, elas serão removidas.

    
por 23.02.2011 / 20:38
1

Uma alternativa usando xargs (1) e tail (1):

Crie as fontes de dados:

$>touch datafile.txt
$>mkfifo pipe1
$>mkfifo pipe2

Inicie os processos finais com xargs:

$>echo datafile.txt pipe1 pipe2 | xargs -n 1 -P 0 tail -f >> datasink.txt

Envie dados para as fontes:

$>echo dataset1 > pipe1
$>echo dataset2 > datafile.txt
$>echo dataset3 > pipe1
$>echo dataset4 > pipe2

Mostrar dados do coletor:

$>cat datasink.txt 
dataset1
dataset2
dataset3
dataset4
    
por 11.04.2014 / 16:35

Tags