Logs

tail -f 直到看到文本

  • August 12, 2021

我有一個帶有命令行界面的 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 的)

您可以通過管道tail -f進入sed,告訴它在看到您正在搜尋的行時退出:

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

sed將預設輸出它處理的每一行,並在看到該行後退出。tail當它試圖寫下一行並看到它的輸出管道被破壞時,該程序將停止

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

-q,意思是安靜,一旦找到匹配項就退出

-x匹配grep整行

對於第二部分,嘗試

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

-m <number>告訴 grep 在數字匹配後停止

並且只有在行尾找到時grep -q才會退出狀態0``SUCCESS

如果你想看到所有的輸出,你不能使用grep -q,但你仍然可以這樣做

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

如果FAILURE出現,除了將退出狀態設置為 1 之外,它會執行所有操作。

引用自:https://unix.stackexchange.com/questions/45941