テキストが表示されるまで `tail -f`

テキストが表示されるまで `tail -f`

リモートでタスクを開始できるコマンドラインインターフェイスを持つCIサーバーがあります(jenkinsCIサーバーとjenkins-cli.jarツール)。

作業を開始したら、tail -f以下を記録します(コマンドが混乱して申し訳ありません)。

ssh -t my-jenkins-host.com "tail -f \"/var/lib/jenkins/jobs/$job_name/builds/\`ls -ltr /var/lib/jenkins/jobs/$job_name/builds/ | grep '^l' | tail -n 1|awk '{print \$9}'\`/log\""

ジョブが正常に完了すると(通常少なくとも5分)、出力に次の行が表示されます。

Finished: SUCCESS

この時点でログテーリングを停止する良い方法はありますか?同様のコマンドがありますかtail_until 'some line' my-file.log

ボーナス:SUCCESSが一致した場合は0を返し、FAILUREが一致した場合は1を返す答えを提供でき、ソリューションがMacで動作する場合! (私はそれがbsdベースであると信じています)

答え1

tail -fにパイプを接続しsedて検索中の行を見つけたら、終了するように指示できます。

tail -f /path/to/file.log | sed '/^Finished: SUCCESS$/ q'

sedデフォルトでは、処理するすべての行を印刷し、その行を見ると終了します。tail次の行を書き込もうとすると、出力パイプが破損していることが判明した場合、プロセスは停止します。

答え2

tail -f my-file.log | grep -qx "Finished: SUCCESS"

-q、静かなことを意味し、一致するものが見つかったら終了します。

-xgrepライン全体を一致させます。

2番目の部分では、以下を試してください。

tail -f my-file.log | grep -m 1 "^Finished: " | grep -q "SUCCESS$"

-m <number>grepに次の後に停止するように指示する数字マッチ

grep -q終了ステータスが行末で見つかった場合にのみ適用されます。0SUCCESS

すべての出力を表示したい場合は使用できませんが、grep -qこれを行うことはできます。

tail -f my-file.log | grep -m 1 "^Finished: "

存在する場合は、終了ステータスを1に設定することをFAILURE除くすべての操作を実行します。

答え3

私はここにある答えが気に入らず、自分で始めることにしました。このbashスクリプトはすべての基準を満たし、失敗時に1を終了する報酬を含みます。

#!/bin/bash
while IFS= read -r LOGLINE || [[ -n "$LOGLINE" ]]; do
    printf '%s\n' "$LOGLINE"
    [[ "${LOGLINE}" == "Finished: SUCCESS" ]] && exit 0
    [[ "${LOGLINE}" == "Finished: FAILURE" ]] && exit 1
done < <(timeout 300 tail -f my-file.log)
exit 3

また、終了コード3が発生するタイムアウト機能も含まれています。システムにタイムアウトコマンドがない場合は、Anthony Thyssenからtimeout.shスクリプトを取得します。

https://antofthy.gitlab.io/software/(「タイムアウト:」検索)

以下の説明に基づいて、エスケープ文字の拡張を停止し、標準の「読み取り」のすべての機能を含むようにログ印刷を更新しました。バラよりhttps://stackoverflow.com/a/10929511完全な「読み取り」の詳細を表示するには。ここではEOF検証は必要ありませんが、完全性のために含まれています。

答え4

あなたも試してみることができます

 grep -q 'App Started' <(tail -f /var/log/app/app.log)

関連情報