You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中获取不含交替屏幕内容的不可编辑脚本输出?

解决alternate screen脚本的干净输出收集问题

不用修改原脚本的前提下,你可以通过以下几种方式过滤掉终端控制字符和中间状态,只保留最终的干净输出:

方法1:用script+col+sed组合捕获并过滤

script命令能模拟完整的终端环境,让脚本正常触发alternate screen逻辑,再配合col去除终端控制字符,sed过滤中间状态行:

# 远程执行脚本并直接过滤输出到文件
ssh user@remote-host "script -q -c '/path/to/target-script' /dev/null" | col -b | sed '/^Waiting/d' > clean-result.txt
  • script -q -c <命令> /dev/null:安静模式下执行目标脚本,把输出直接导向stdout而非本地文件
  • col -b:移除所有终端控制字符(包括alternate screen切换、颜色、光标移动等序列)
  • sed '/^Waiting/d':删除所有以Waiting开头的中间状态行,可根据实际输出调整匹配规则

如果需要先保存完整输出再过滤:

# 先捕获完整输出
ssh user@remote-host "script -q -c '/path/to/target-script' output.raw"
# 本地过滤
col -b < output.raw | sed '/^Waiting/d' > clean-result.txt

方法2:直接用sed过滤ANSI控制字符

如果不需要处理复杂的终端控制序列,也可以直接用sed匹配并删除ANSI控制字符:

ssh user@remote-host "/path/to/target-script" | sed -e 's/\x1b\[[0-9;?]*[a-zA-Z]//g' -e '/^Waiting/d' > clean-result.txt

这个命令里的sed表达式会匹配所有常见的ANSI终端控制序列(包括颜色、光标移动、屏幕切换等)并删除,再过滤掉中间状态行。

方法3:用expect模拟终端捕获输出

如果脚本有特殊的交互逻辑,可借助expect模拟终端环境并捕获输出后处理:

#!/usr/bin/expect
# 远程执行目标脚本
spawn ssh user@remote-host /path/to/target-script
# 等待脚本执行结束
expect eof
# 提取完整输出
set full_output $expect_out(buffer)
# 移除所有终端控制字符
regsub -all {\x1b\[[0-9;?]*[a-zA-Z]} $full_output "" clean_output
# 过滤中间状态行
regsub -all {^Waiting.*\n} $clean_output "" final_result
# 输出干净结果
puts $final_result

将上述代码保存为get-clean-output.exp,赋予执行权限后运行即可:

chmod +x get-clean-output.exp
./get-clean-output.exp > clean-result.txt

内容的提问来源于stack exchange,提问作者phate89

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:20:37