Salida a stdout y al mismo tiempo grep en un archivo

18

Tengo un script que envía texto a stdout. Quiero ver toda esta salida en mi terminal, y al mismo tiempo quiero filtrar algunas líneas y guardarlas en un archivo. Ejemplo:

$ myscript
Line A
Line B
Line C

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

$ cat out.file
Line A
Line C

Quiero ver la salida del primer comando en la terminal y guardar la salida del segundo comando en un archivo. Al mismo tiempo. Intenté usar tee, pero sin resultado, o mejor, con resultado inverso .

lorenzo-s
fuente

Respuestas:

27

Quiero ver la salida del primer comando en la terminal y guardar la salida del segundo comando en un archivo.

Mientras no te importe si lo que estás viendo es de stdout o stderr , aún puedes usar tee:

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

Trabajará en linux; No sé si "/ dev / stderr" es igualmente aplicable en otros * nixes.

encerrada dorada
fuente
9
/dev/stderrEs común. /dev/tty(es decir, el terminal actual) también funcionaría aquí, y es estándar .
Gilles 'SO- deja de ser malvado'
@Gilles: maravilloso. tee /dev/tty¡Sirvió maravillosamente para mi requerimiento de tener que imprimir el stdoutscript en la terminal y canalizarlo al stdinotro comando también! Gracias! :-)
jamadagni
8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

O con la sustitución de procesos (ksh93, zsh o bash):

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

Con zsh:

... >&1 > >(grep -e A -e C > out.file)
Stéphane Chazelas
fuente
Descubrí que tenía que usar el primero porque conserva el código de salida de grep. Además, si por alguna razón no puede acceder al sistema de archivos / dev, /dev/fd/3se puede reemplazar con>(cat 1>&3)
golvok
4

Aquí hay otra forma con sed:

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

Por defecto, sedimprime cada línea, por lo que en este caso stdout será el mismo que stdin (es decir, verá la salida completa de la myscriptpantalla).
Además, todas las líneas coincidentes PATTERNse combinarán wconout.file

don_crissti
fuente
-1

no especificó cómo utilizó el comando tee pero esto debería funcionar:

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

al menos funcionó en mi servidor hace unos minutos ...

MelBurslan
fuente
44
Pero, si no me equivoco, de esta manera grep también lo que está en la pantalla. Quiero ver toda la salida en pantalla y filtrar solo lo que está pasando en el archivo.
lorenzo-s