Estoy ejecutando una herramienta de Unix que toma la opción -l log_file . Me gustaría redirigir eso a una tubería, algo como esto:
my_tool -l /dev/tty | grep "Aye, Caramba!" Desafortunadamente, cuando especifico /dev/tty , la salida de my_tool va directamente a la ventana de la consola, sin pasar por grep .
También probé /dev/stdout , sin éxito.
Por lo tanto, la pregunta: ¿qué debo especificar para la opción -l anterior para capturar la salida correspondiente en la tubería?
Podrías intentar usar una tubería con nombre :
mkfifo pipe grep "Aye, Caramba!" pipe & my_tool -l pipe En este ejemplo, grep abrirá la pipe para lectura, que se bloqueará hasta que otro proceso la abra para escritura. Cuando my_tool escribe datos en la tubería, grep podrá leer los datos. Una vez que my_tool cierra la pipe , grep obtendrá una indicación de fin de archivo y saldrá.
Puede usar la sustitución de procesos para crear un identificador de archivo que canalice cualquier contenido escrito en el identificador a través de una canalización de comandos.
Por ejemplo, esto debería funcionar:
my_tool -l >(grep "Aye, Caramba!" > path/to/store/partial.log) Esto le pasa a my_tool una ruta /dev/fd/XXX en la que puede escribir. Cualquier contenido escrito en esa ruta se canaliza a través de grep y luego se escribe en el archivo partial.log .
Funcionalmente, esto es similar a la sugerencia de Kenster de usar canalizaciones con nombre, pero en mi opinión, a menudo es más fácil trabajar con la sustitución de procesos y razonar sobre ella.
Puede ser útil ejecutar un proceso que genere el registro y otro que siga el registro que se crea y grepping su salida
Para hacerlo de esa manera, en una consola podría ejecutar my_tool, generando el registro deseado.
my_tool -l /tmp/mylogLuego, en una consola diferente, podría ejecutar:
tail -f -n+0 /tmp/mylog | grep --line-buffered the_pattern_to_match tail imprimirá las "últimas" líneas del archivo pasado como argumento. -n+0 le dice a tail que procese el archivo completo hasta donde se ha escrito. -f decirle a tail que mantenga el archivo abierto y que siga enviando lo que llegue a la salida estándar (en este caso redirigido a la canalización).
Luego, en grep, querrá el --line-buffered para que no espere a que finalice la cola antes de imprimir su propia salida.
Espero que esto ayude.