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 .

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.


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)

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


-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 ...


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.