`tail -f` 直到看到文本

aar*_*acy 25 logs tail

我有一个带有命令行界面的 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\""
Run Code Online (Sandbox Code Playgroud)

作业成功完成后,通常至少 5 分钟后,我在输出中得到以下行:

Finished: SUCCESS
Run Code Online (Sandbox Code Playgroud)

有没有什么好方法可以在这一点上停止拖尾日志?即有像tail_until 'some line' my-file.log命令吗?

奖励:如果您提供的答案在 SUCCESS 匹配时返回 0,FAILURE 匹配时返回 1,并且您的解决方案适用于 mac,则可以获得额外的积分!(我相信这是基于 bsd 的)

Mic*_*zek 49

您可以通过管道输入tail -finto sed,告诉它在看到您正在搜索的行时退出:

tail -f /path/to/file.log | sed '/^Finished: SUCCESS$/ q'
Run Code Online (Sandbox Code Playgroud)

sed将默认输出它处理的每一行,并在看到该行后退出。tail当它尝试写入下一行并看到其输出管道损坏时,该进程将停止

  • 如果 `Finished: SUCCESS` 是输出的最后一行,这可能不起作用 (8认同)
  • @aaronstacy 如果您使用的是 GNU grep,则 `q` 命令采用可选的退出代码。所以`sed` 命令将是`sed '/^Finished: SUCCESS$/ q0; /^完成:失败$/ q1'` (7认同)
  • 这个解决方案有一个主要缺陷:在我的情况下,日志以搜索行结束。不会再写任何行,因此该过程将卡住,因为 tail 无法中断 :( (3认同)
  • 这确实打印了直到并包括所需行的所有内容,但似乎“tail”从未真正退出,而只是挂起。我在运行 Jenkins 的 Linux 服务器(发行版未知)以及我的开发 Mac 上都看到了同样的行为。 (2认同)

Mik*_*kel 7

tail -f my-file.log | grep -qx "Finished: SUCCESS"
Run Code Online (Sandbox Code Playgroud)

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

-x使grep匹配整行

对于第二部分,请尝试

tail -f my-file.log | grep -m 1 "^Finished: " | grep -q "SUCCESS$"
Run Code Online (Sandbox Code Playgroud)

-m <number>告诉 grep 在数字匹配后停止

并且grep -q退出状态只会是0如果SUCCESS在行尾找到

如果您想查看所有输出,则不能使用grep -q,但您仍然可以这样做

tail -f my-file.log | grep -m 1 "^Finished: "
Run Code Online (Sandbox Code Playgroud)

如果FAILURE出现,除了将退出状态设置为 1 之外,它会执行所有操作。

  • 我最初在答案中使用了 `grep`,但如果他使用 `tail -f`,他可能想查看文件输出;`grep` 不会显示所有的中间行 (5认同)

小智 5

我不喜欢这里的任何答案,所以决定推出我自己的答案。此 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
Run Code Online (Sandbox Code Playgroud)

还包括超时功能,这将导致退出代码为 3。 如果您的系统上没有 timeout 命令,请从 Anthony Thyssen 获取 timeout.sh 脚本:

https://antofthy.gitlab.io/software/(搜索“超时:”)

根据下面的评论,我更新了日志打印以停止转义字符扩展并包含标准“读取”的所有功能。有关完整的“阅读”详细信息,请参阅/sf/answers/765065801/。这里不需要 EOF 检查,但为了完整性而包括在内。