プログラムが SIGPIPE (デフォルトのアクション) で終了する場合は、その行を読み取って終了するリーダーに出力をパイプするだけで十分です。
したがって、それは次のように単純かもしれません
$ program | sed -e '/Suitable text from the line/q'
デフォルトの出力を抑制したい場合
$ program | sed -n -e '/Suitable text from the line/q'
同様に、特定の行数で停止したい場合は、sed の代わりに head を使用できます。例:
$ program | head -n$NUMBER_OF_LINES_TO_STOP_AFTER
キルが発生した正確な時刻 startdt がコメントで示唆しているように、端末のバッファリング動作に依存します。
このようなラッパー スクリプトは、標準的なアプローチです。スクリプトはバックグラウンドでプログラムを実行してからループし、ログ ファイルで文字列を毎分チェックします。文字列が見つかった場合、バックグラウンド プログラムは強制終了され、スクリプトは終了します。
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
dmckee の回答の代わりに、 grep
-m
のコマンド オプション (このマニュアルページなどを参照) コマンドも使用できます:
compbio | grep -m 1 "Text to match"
テキストに一致する行が 1 行見つかったときに停止するか、
compbio | grep -v -m 10 "Text to match"
指定されたテキストに一致しない 10 行を待機します。