【问题标题】:Trim output of running program修剪运行程序的输出
【发布时间】:2021-05-14 22:08:51
【问题描述】:

我有一个程序,当它运行时,会输出数百行以“Info:”开头的行和几行有用的输出。为了让事情变得更简单,我创建了一个简单的 python 和 bash 组合脚本来模拟我遇到的问题:

wait_2sec.py:

import time

print("Hello!")
time.sleep(2)
print("Goodbye!")

我正在尝试通过运行来修剪我的输出:

 python wait_2sec.py | sed '/Goodbye/d'

但是,sed 不输出 Hello!直到python脚本完成之后。我不知道管道是否等到程序完成后才开始运行 sed 命令,或者 sed 命令是否挂断。 如果 sed 不适用于此用例,我愿意使用另一个命令来修剪输出。

【问题讨论】:

  • 为什么不简单地使用 bash? (echo "Hello!"; sleep 2; echo "Goodbye!") | sed '/Goodbye/d'?或者您可以为echosleep 使用大括号括起来的列表而不是子shell,但是您需要用空格分隔并以';' 结尾,例如{ echo "Hello!"; sleep 2; echo "Goodbye!"; } | sed '/Goodbye/d'
  • 切线,听起来像是您的 Python 程序中的设计缺陷。使用logging,您可以通过设置日志级别轻松关闭所有INFO: 输出。这些消息应该打印在标准错误上,而不是标准输出上; logging 也是开箱即用的。

标签: bash sed trim


【解决方案1】:

我不知道管道是等到程序完成后才开始运行 sed 命令,还是 sed 命令是挂断。

实际上两者都不是,python 通常会缓冲其输出(如果不是到终端),直到缓冲区已满,因此如果安装了unbuffer,Moustapha 的建议可能会起作用。但是您可以简单地使用python 的内置选项-u强制 stdout 和 stderr 流不缓冲。):

python -u wait_2sec.py | sed '/Goodbye/d'

【讨论】:

    【解决方案2】:

    您可以尝试使用以下命令运行您的脚本:

    unbuffer python wait_2sec.py | sed '/Goodbye/d'
    

    参考:https://unix.stackexchange.com/a/200413

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 2014-07-01
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      相关资源
      最近更新 更多