Wenn Ihr Programm mit SIGPIPE beendet wird (was die Standardaktion ist), sollte es ausreichen, die Ausgabe in einen Reader zu leiten, der beim Lesen dieser Zeile beendet wird.
Es könnte also so einfach sein wie
$ program | sed -e '/Suitable text from the line/q'
Wenn Sie die Standardausgabe unterdrücken möchten, verwenden Sie
$ program | sed -n -e '/Suitable text from the line/q'
Ebenso könnte man, wenn man nach einer bestimmten Anzahl von Zeilen aufhören möchte, head anstelle von sed verwenden, z. B.
$ program | head -n$NUMBER_OF_LINES_TO_STOP_AFTER
Der genaue Zeitpunkt, zu dem der Kill erfolgt passt hängen vom Pufferverhalten des Terminals ab, wie stardt in den Kommentaren vorschlägt.
Ein Wrapper-Skript wie dieses ist ein Standardansatz. Das Skript führt das Programm im Hintergrund aus und durchläuft dann eine Schleife, wobei jede Minute die Protokolldatei auf eine Zeichenfolge überprüft wird. Wenn die Zeichenfolge gefunden wird, wird das Hintergrundprogramm beendet und das Skript beendet.
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
Als Alternative zur Antwort von dmckee wird der grep
Befehl mit dem -m
Option (siehe z. B. diese Manpage) Befehl kann auch verwendet werden:
compbio | grep -m 1 "Text to match"
zu stoppen, wenn 1 Zeile gefunden wird, die mit dem Text übereinstimmt, oder
compbio | grep -v -m 10 "Text to match"
auf 10 Zeilen zu warten, die nicht mit dem gegebenen Text übereinstimmen.