如何在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
相关产品推荐
相关产品推荐

