Se il tuo programma terminerà su SIGPIPE (che è l'azione predefinita) dovrebbe essere sufficiente reindirizzare l'output in un lettore che uscirà leggendo quella riga.
Quindi potrebbe essere semplice come
$ program | sed -e '/Suitable text from the line/q'
Se vuoi sopprimere l'output predefinito usa
$ program | sed -n -e '/Suitable text from the line/q'
Allo stesso modo se ci si vuole fermare dopo un certo numero di righe si potrebbe usare head al posto di sed, es.
$ program | head -n$NUMBER_OF_LINES_TO_STOP_AFTER
L'ora esatta in cui si verifica l'uccisione fa dipendono dal comportamento di buffering del terminale come suggerisce startt nei commenti.
Uno script wrapper come questo è un approccio standard. Lo script esegue il programma in background e quindi esegue il loop, controllando il file di registro ogni minuto per una stringa. Se la stringa viene trovata, il programma in background viene terminato e lo script si chiude.
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
In alternativa alla risposta di dmckee, il grep
comando con -m
option (vedi ad esempio questa pagina man) può essere utilizzato anche il comando:
compbio | grep -m 1 "Text to match"
per interrompersi quando viene trovata 1 riga corrispondente al testo o
compbio | grep -v -m 10 "Text to match"
attendere 10 righe che non corrispondono al testo specificato.