usando stdout duas vezes (mas não tee como eu sei)

1

Eu tenho uma pergunta relacionada a    como posicionar o stdout em duas direções mas com um toque diferente. (Eu já sei sobre o tee!:)

Gostaria que a saída aparecesse como é (tee to console?) e fosse canalizada para um refinamento adicional.

Exemplo: eu tenho

ps -ef | grep -i something

agora gostaria que ambos vissem esse resultado e o refinassem ainda mais, por exemplo com

| awk '{print "epwdx "$2}'

É claro que posso executar os dois comandos sequencialmente e capturar todos os resultados, mas às vezes gostaria de executá-los como uma unidade, talvez aumentando as chances de que eles digam uma verdade atual consistente.

Talvez exista uma maneira de usar outros truques (como -, 2 & gt ;, & 2 ou semelhantes), mas ainda não vejo um.

    
por Tim 30.03.2017 / 13:05

5 respostas

3

Se você quiser extrair a saída do meio de um canal para o terminal, poderá tee to /dev/tty (ou /dev/stderr ).

Isso deve imprimir a saída de something no terminal e direcionar o mesmo em somefilter para o arquivo de saída.

somecmd | tee /dev/tty | somefilter > output 

Embora se você quiser revisar a saída mais tarde, pode ser mais fácil apenas salvar a saída final e intermediária nos arquivos e, em seguida, analisá-los.

No entanto, se tudo o que você deseja é filtrar o conjunto de processos mostrado por ps ou os campos impressos, o programa também possui algumas opções internas. Consulte o manual para "Seleção de processos", "Formato de saída" e "Especificadores de formato" .

    
por 30.03.2017 / 13:14
2

Como eu (quase) sugeri em um comentário, você poderia usar algo assim:

ps -ef | grep -i something | tee /dev/stderr | awk '{print "epwdx "$2}'

No entanto, também é possível modificar o comando awk , especialmente se você estiver usando o GNU awk ( gawk ), com algo assim que elimina a necessidade do grep :

ps -ef | awk '
    BEGIN {IGNORECASE=1}
    /something/ { print ">> Matched 'something' here:", $0; print "epwdx "$2 }
'

(Toda a declaração awk pode ficar confortavelmente em uma linha, se você preferir. Basta remover as novas linhas. Eu a dividi aqui para facilitar a leitura.)

    
por 30.03.2017 / 16:04
2

Você pode usar pee se tiver:

pee is like tee but for pipes. Each command is run and fed a copy of the standard input. The output of all commands is sent to stdout. Note that while this is similar to tee, a copy of the input is not sent to stdout, like tee does.

Parece que você terá que especificar implicitamente um comando que copia a entrada para STDOUT:

ps -ef | pee "cat" "grep -i something"
    
por 30.03.2017 / 17:34
2

Você pode usar tee com a substituição do processo como

ps -ef | grep -i something | tee >(awk '{print "epwdx "$2}')

embora eu ache que o @roaima forneceu uma boa solução awk , que é provavelmente o melhor caminho a seguir

    
por 30.03.2017 / 17:43
0

Tanto quanto sei, isso não pode ser feito apenas com descritores de arquivos e parece que o truque sugerido com tee >/dev/tty é suficiente para fazer o seu trabalho.

Apenas para compartilhar informações, eu faço esse trabalho com uma função no meu perfil bash assim:

function teee { a="$(</dev/stdin)";echo -e "pipe in\n$a\npipe out\n" >/dev/stderr; echo "$a"; }

Teste:

$ cat file11 |teee|grep -Po '[A-Za-z]+[\s|\w]+,\s[0-9]+' file11 | teee |awk '{print $2}'
pipe in
Ubuntu, 120, 143, 154
Yggdrasil, 144, 170-171
Yood, Charles, 6
We Were Young, Bob, 178-179
Zawinski, Jamie, 204
pipe out

pipe in
Ubuntu, 120
Yggdrasil, 144
Charles, 6
Bob, 178
Jamie, 204
pipe out

120
144
6
178
204
    
por 30.03.2017 / 17:15