Como dividir e recombinar o stdout pipe no bash?

1

Estou analisando o texto na linha de comando. Como posso pegar a saída de um comando e usá-lo em dois lugares no próximo comando?

some_command | head -n $( awk '/search_term/ {print FNR} output_of_some_command ) output_of_some_command

Estou truncar a saída de some_command usando head , mas preciso pesquisar a saída de some_command (usando awk neste caso) para localizar o número da linha no qual truncar.

Posso fazer isso ou preciso gravar em um arquivo temporário?

    
por Ashley G 16.10.2014 / 00:04

1 resposta

1

Para essa tarefa específica, você pode usar sed em vez de head - ou você pode usar awk em vez de head :

some_command | awk '{print} /search_term/{exit}'

Imprima linhas, mas, quando encontrar uma que corresponda ao termo de pesquisa, saia (e não processe mais linhas depois disso).

Uma solução mais geral para o problema que você descreve é

some_command | tee >(command2) | command3

ou

some_command | tee >(command2) >(command3)

Estes funcionarão em bash , mas provavelmente não em muitos outros shells (incluindo sh ). >(command) fornece um identificador de arquivo para um canal para um processo executando command . Como você provavelmente sabe, tee permite pegar um fluxo de dados e gravá-lo em vários lugares.

Mas o seu problema é mais delicado do que o que você disse. Você não está tentando fazer

vocêestátentandofazer

em que o comando head (corresponde a C no diagrama) recebe entrada de " some_command " ( A ) mas também tem um argumento de linha de comando definido a partir da saída de awk ( B ). Eu suspeito que uma solução geral para isso seria muito mais difícil.

    
por 16.10.2014 / 00:14