Si su programa terminará en SIGPIPE (que es la acción predeterminada), debería ser suficiente para canalizar la salida a un lector que se cerrará al leer esa línea.
Así que podría ser tan simple como
$ program | sed -e '/Suitable text from the line/q'
Si desea suprimir el uso de salida predeterminado
$ program | sed -n -e '/Suitable text from the line/q'
Del mismo modo, si uno quiere detenerse después de un cierto número de líneas, puede usar head en lugar de sed, por ejemplo,
$ program | head -n$NUMBER_OF_LINES_TO_STOP_AFTER
La hora exacta en la que se produce la matanza no dependen del comportamiento de almacenamiento en búfer del terminal como sugiere stardt en los comentarios.
Un script contenedor como este es un enfoque estándar. La secuencia de comandos ejecuta el programa en segundo plano y luego realiza un bucle, verificando el archivo de registro cada minuto en busca de alguna cadena. Si se encuentra la cadena, el programa en segundo plano se cancela y el script se cierra.
command="prog -foo -whatever"
log="prog.log"
match="this is the what i want to match"
$command > "$log" 2>&1 &
pid=$!
while sleep 60
do
if fgrep --quiet "$match" "$log"
then
kill $pid
exit 0
fi
done
Como alternativa a la respuesta de dmckee, el grep
comando con el -m
También se puede usar el comando de opción (consulte, por ejemplo, esta página del manual):
compbio | grep -m 1 "Text to match"
detenerse cuando se encuentre 1 línea que coincida con el texto o
compbio | grep -v -m 10 "Text to match"
esperar 10 líneas que no coincidan con el texto dado.