it-swarm-pt.tech

A saída de um comando pode ser canalizada para dois outros comandos?

Como posso canalizar a saída de um comando para a entrada de dois outros comandos simultaneamente?

28
Richard Hoskins

Parece que o comando tee fará o que você quiser.

A chave é usar

>( )

para substituição de processo . Com tee, use o seguinte padrão:

tee >(proc1) >(proc2) >(proc3) | proc4

Então, se você quiser usar a saída de ls como entrada para dois programas grep diferentes, salve a saída de cada grep em arquivos diferentes e canalize todos os resultados através less, tente:

ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less

Os resultados do ls -A será "canalizado" em ambos greps. O arquivo hidden-files terá o conteúdo da saída do primeiro grep e normal-files terá os resultados do segundo grepTodos os arquivos serão mostrados no pager less. [~ # ~] editar [~ # ~] : o que você vê em less é o mesma saída exata de ls -A, não o resultado de greps. Se você deseja modificar a saída de ls -A to less, (por exemplo, trocando a ordem para que os arquivos normais sejam listados antes dos ocultos), tente isto:

ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less

Sem >/dev/null, a saída de greps seria anexada à saída de ls -A em vez de substituí-lo.

fonte

59
Ben

Use "tee".

Exemplo:

grep someSearchString someFile | tee /dev/tty | wc -l > grepresult

Isso enviará a saída do comando grep para o terminal e para wc (cuja saída é, por sua vez, redirecionada para o arquivo grepresult).

"Tee" é explicado no artigo da Wikipedia tee (command). Central é: "O comando tee lê a entrada padrão, então grava seu conteúdo na saída padrão e simultaneamente o copia para o (s) arquivo (s) ou variáveis ​​especificadas.".

6
Peter Mortensen