Saída para stdout e, ao mesmo tempo, grep em um arquivo

18

Eu tenho um script que gera texto para stdout. Quero ver toda essa saída no meu terminal e, ao mesmo tempo, quero filtrar algumas linhas e salvá-las em um arquivo. Exemplo:

$ myscript
Line A
Line B
Line C

$ myscript | grep -P 'A|C' > out.file

$ cat out.file
Line A
Line C

Eu quero ver a saída do primeiro comando no terminal e salvar a saída do segundo comando em um arquivo. Ao mesmo tempo. Tentei usar tee, mas sem resultado, ou melhor, com resultado revertido .

Lorenzo-s
fonte

Respostas:

27

Eu quero ver a saída do primeiro comando no terminal e salvar a saída do segundo comando em um arquivo.

Contanto que você não se importe se o que está vendo é stdout ou stderr , você ainda pode usar tee:

myscript | tee /dev/stderr | grep -P 'A|C' > out.file

Trabalhará no linux; Não sei se "/ dev / stderr" é igualmente aplicável em outros * nixes.

Cachinhos Dourados
fonte
9
/dev/stderré comum. /dev/tty(o terminal atual) também funcionaria aqui, e é padrão .
Gilles 'SO- stop be evil'
@ Gilles: Maravilhoso. tee /dev/ttyserviu maravilhosamente por minha exigência de ter que imprimir o stdoutscript de um terminal e canalizá-lo para o stdinde outro comando também! Thankees! :-)
jamadagni
8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

Ou com substituição de processo (ksh93, zsh ou bash):

... | tee >(grep -e A -e C > out.file)

Com zsh:

... >&1 > >(grep -e A -e C > out.file)
Stéphane Chazelas
fonte
Eu descobri que tinha que usar o primeiro porque preserva o código de saída do grep. Além disso, se por algum motivo você não puder acessar o sistema de arquivos / dev, ele /dev/fd/3poderá ser substituído por>(cat 1>&3)
golvok
4

Aqui está outra maneira de sed:

myscript | sed '/PATTERN/w out.file'

Por padrão, sedimprime todas as linhas para que, neste caso, stdout seja o mesmo que stdin (ou seja, você verá toda a saída myscriptna tela).
Além disso, todas as linhas correspondentes PATTERNserão wescritas paraout.file

don_crissti
fonte
-1

você não especificou como usou o comando tee, mas isso deve funcionar:

myscript | grep -P 'A|C' | tee out.file

pelo menos funcionou no meu servidor há alguns minutos ...

MelBurslan
fonte
4
Mas, se não estou errado, dessa forma você também cumprimenta o que está na tela. Quero ver toda a saída na tela e filtrar apenas o que está entrando no arquivo.
Lorenzo-s