gpt4 book ai didi

bash - 当传递给 sed 或 awk 时,冗长的管道命令输出挂起

转载 作者:行者123 更新时间:2023-11-29 09:32:31 24 4
gpt4 key购买 nike

背景

我正在对我的 CI 构建进行更改,该构建会触发一个命令来运行我的 Xcode 单元测试输出。这些测试记录了极其冗长的信息量——太多以至于我超过了 4 MB 的日志捕获限制并且我的构建被终止。据我所知,我没有办法让它不那么冗长(我想出的一种方法是需要更改运行测试的命令,which I'm working on

我的解决方法

所以我决定变聪明,尝试使用 sed 过滤我的输出,如下所示:

test_running_command | sed '/xctest\[/d; /^$/d'

当我在文件上运行 sed 命令时,它会正常工作,按预期过滤掉包含 xctest[ 的行和空行。但是当我将它合并到我的 CI 构建中时,我​​看到输出流到某个点,然后就停止了。 10 分钟后,在我有机会达到 4 MB 限制之前,我的 CI 构建无论如何都被杀死了。

问题

为什么 sed 挂成这样?

已执行故障排除

  • 我尝试使用 awk,就像这样,它同样挂起。

    test_running_command | awk '$0 !~ /xctest\[/ && $0 !~ /^$/ {print}'
  • 我尝试了一个命令 from this answer为原来的命令打开行缓冲,它只是卡在不同的地方。

    script -q /dev/null test_running_command | <sed or awk command from above>
  • 正如@CharlesDuffy 在评论中所建议的那样,我使用 tee 将进入管道的内容写入文件,并确定管道的左侧肯定比正确的。我(在我的本地机器上)观察到,虽然控制台的输出被卡住,但 before_filter.txt 仍在继续。这是我使用的行:

    test_running_command | tee before.txt | sed '/xctest\[/d; /^$/d' | tee after.txt
  • 正如@LuisMuñoz 在评论中所建议的那样,我尝试使用 stdbuf(在使用 brew install coreutils 安装之后)禁用进出 sed 的缓冲。我没有看到行为上的差异。输出仍然卡住在任意点。

    test_running_command | gstdbuf -i0 -o0 sed '/xctest\[/d; /^$/d'

最佳答案

我发现了 sed-l 标志。显然,这打开了行缓冲模式,产生了预期的效果。我想知道它是否有问题,因为它的缓冲区被产生的令人难以置信的长行溢出了。不管怎样,这个命令最终起作用了:

 test_running_command | sed -l '/xctest\[/d; /^$/d'

附带说明一下,我有一个测试在 CI 服务器上花费的时间超过 10 分钟,并且没有日志输出,这导致了超时。我在其外层循环中放置了一个 printf 语句,它产生的日志输出刚好足够,因此构建不会被终止。 printf 行没有被 sed 命令过滤,所以这是完美的。

关于bash - 当传递给 sed 或 awk 时,冗长的管道命令输出挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49661118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com