使用screen hardcopy -h导出含GRUB菜单的日志出现特殊字符问题
问题原因
GRUB菜单包含用于终端格式渲染的ANSI控制字符(比如B对应Ctrl+B,用于文本加粗;L是清屏指令;^P是上翻操作),这些字符是GRUB实现菜单样式的底层指令:
- 手动复制终端内容时,终端会自动解析这些控制字符,只保留最终显示的可视文本;
screen hardcopy -h是直接导出滚动缓冲区里的原始数据,包括终端收到的所有字节(控制字符、NULL值等),所以会出现特殊字符,和手动复制效果不一致。
解决方案
要实现和手动复制完全一致的效果,需要让工具先解析控制字符,再捕获最终的可视输出,以下是两种可行方案:
方案1:使用script命令(推荐)
script命令专门用于记录终端会话的输出,会自动处理控制字符,生成和手动复制一致的内容:
export input_file export output_file # 直接捕获输出,会包含script的开头注释行 script -q -c "cat \"$input_file\"" "$output_file" # 如果需要去掉开头的注释行(比如Script started on...),可以用sed过滤 script -q -c "cat \"$input_file\"" /tmp/screen_temp && sed '1,2d' /tmp/screen_temp > "$output_file" && rm /tmp/screen_temp
-q参数:静默模式,不显示script的启动提示;-c参数:指定要执行的命令(这里是cat日志文件);- 最后用sed去掉前两行注释,得到纯可视内容。
方案2:改进screen脚本,结合col命令解析控制字符
如果必须使用screen,可以用col命令解析终端控制序列,模拟终端渲染后的效果:
export input_file export output_file export scrollback_size screen -Dmc /dev/null sh -c ' screen -X scrollback "$scrollback_size" cat < "$input_file" | col -b > "$output_file" '
col -b:过滤掉所有控制字符,只保留可视文本,和终端解析后的输出一致;- 这种方式不需要依赖screen的hardcopy,直接通过管道处理后写入输出文件。
内容的提问来源于stack exchange,提问作者Abhi Singh
相关产品推荐
相关产品推荐

