2 votos

¿Cómo canalizar a grep play (sox) de salida?

Parece una tontería situación: tengo este comando (por pomodoros):

play -n synth 25:00 pinknoise

No quiero silencioso completamente la salida (-q opción), sólo una parte (en el encabezado). grep no trabaja. No estoy seguro de cómo ese tipo de actualizado de salida (como en npm install ... funciona).

La producción Normal:

File Size: 94.3T     
 Encoding: n/a           
 Channels: 1 @ 32-bit   
Samplerate: 48000Hz      
Replaygain: off         
 Duration: unknown      

In:0.00% 00:00:01.02 [00:00:00.00] Out:49.2k [======|======] Hd:1.3 Clip:0 

Deseo filtrado de salida: 01.02 (este número se actualiza, como en un rizo o pv barra de progreso)

¿Cómo puedo grep sólo la parte de la salida?

Hasta ahora:

  • La salida se envía stderr, como con "Permiso denegado" de find. Una manera fácil para probar (yo pensaba que yo probé) es agregar al final 2> /dev/null.

    Creo que la razón de sox/juego de salida stderr es porque admite la escritura de la salida a la salida estándar (stdout) utilizando el nombre de archivo - (ver sox hombre de la página).

  • Pero |& grep "^In" no trabaja. El uso de |& tee log.txt parece utiliza el carácter de eliminación de la actualización de la última línea.

    He intentado grep --line-buffered, unbuffer y stdbuf (después de readint este y este) con algunos de los grandes avances:

    play -n synth 25:00 pinknoise  2>&1 | stdbuf -oL tr '\r' '\n' | grep -o '[0-9][0-9]*\.[0-9][0-9] '
    

Que está muy cerca! Me pregunto si es posible obtener solamente una línea actualizada como estaba en el original de salida. No sé por qué algo como | grep --line-buffered . no funciona. Necesito algo como tail -f -n 1.

1voto

dessert Puntos 928

Usted puede grep la salida si la tubería stderr, por ejemplo:

$ play -n synth 25:00 pinknoise |& grep File
 File Size: 2.52G

De Tuberías de sección de GNU Bash manual:

Si '|&' es usado, command1's error estándar, además de su en la salida estándar, está conectado a command2's de la entrada estándar a través de la tubería; es la abreviatura de 2>&1 |. Esta redirección implícita de el error estándar a la salida estándar se realiza después de cualquier redirecciones especificado por el comando.

Sin embargo, esto no funcionará para la línea de progreso: los comandos de la CLI suele realizar la prueba si el resultado es un terminal y descartar actualizado de salida si no lo es. Necesitamos un hacky solución para conseguir alrededor de eso. En primer lugar redirigir la salida a un archivo:

play -n synth 25:00 pinknoise &>sox.log

Esto bloquea el terminal actual, y usted puede no sólo tiene que enviar a segundo plano, porque entonces se descarta el progreso de la línea de nuevo. Para conseguir esta línea, abrir una segunda terminal en el mismo directorio y procesar el archivo, por ejemplo:

$ grep In sox.log
In:0.00% 00:00:03.24 [00:00:00.00] Out:156k  [======|======] Hd:0.8 Clip:0
$ tail -n+10 sox.log; echo
In:0.00% 00:00:10.24 [00:00:00.00] Out:492k  [!=====|=====!] Hd:1.7 Clip:0

La ventaja de usar tail es que también te Aborted. línea cuando el play salido:

$ tail -n+10 sox.log;echo
In:0.00% 00:00:12.80 [00:00:00.00] Out:614k  [======|======] Hd:0.7 Clip:0    
Aborted.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: