Logs
tail -f
直到看到文本
我有一個帶有命令行界面的 CI 伺服器,允許我遠端啟動工作(
jenkins
CI 伺服器和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 之外,它會執行所有操作。