Como duplicar um fluxo e processar as duas partes de maneira contínua?

3

Às vezes, quero inserir algo em um pipeline para relatórios ou algum outro uso secundário. Pode ser tão simples quanto wc -l , ou uma besta mais complexa como awk ou até mesmo um script python. Seria bom administrar um pipeline assim:

zcat my_data_file.gz \
| wc -l > /tmp/linecount
| process_data.py

O problema é que a maioria dos utilitários não corrige os dados para o stdout. tee pode gravar os dados em um arquivo temporário, mas tenho que esperar até que tudo seja feito:

zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py && \
wc -l /tmp/f > /tmp/linecount && rm /tmp/f

Isso não é ideal: pode ser um pipeline de longa duração; Eu posso querer ver os resultados intermediários do análogo para wc mais cedo; e talvez eu não queira armazenar todos os dados em um arquivo temporário.

    
por Cera 14.04.2013 / 07:53

2 respostas

4

Você pode usar tee e processar substituição >(...) para isso:

zcat my_data_file.gz |

# Count number of lines in stream
tee >(wc -l > /tmp/linecount) |

# Further processing
process_data.py

Note que os pipes podem ser usados para continuação de linha e que os comentários podem ser intercalados entre comandos, um recurso interessante ao construir pipelines complicados.

    
por 15.04.2013 / 11:43
1

Não é totalmente eficiente, mas você pode conseguir isso com pipes nomeados , que você pode criar com mkififo(1)

Para o exemplo na pergunta:

mkfifo /tmp/f

wc -l /tmp/f > /tmp/linecount &

zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py &

wait

rm /tmp/f

Observe o & anexado ao wc e ao pipeline; Isso significa que o shell irá empurrar as tarefas para o segundo plano. A chamada para wait aguarda que todas as tarefas em segundo plano sejam concluídas. Ambos os processos terminarão aproximadamente ao mesmo tempo.

Tenha em atenção que, se um dos seus processos for substancialmente mais lento, poderá abrandar tudo de forma significativa, pois tee pode bloquear o seu canal stdout ou o pipe nomeado para o qual está a escrever. Editar : Além disso, agora tem mais modos de falha, já que o tee sairá devido a um cano quebrado se o processo secundário falhar.

    
por 14.04.2013 / 07:53