我正在使用 Linux 的“脚本”命令 http://www.linuxcommand.org/man_pages/script1.html跟踪一些交互式会话。输出文件包含无法打印的字符,包括我的退格键击键。
有没有办法整理这些输出文件,以便它们只包含屏幕上显示的内容?
或者是否有另一种方法来记录交互式 shell 会话(输入和输出)?
答案1
如果您想查看文件,那么您可以通过 发送输出col -bp
;这将解释控制字符。然后,如果您愿意,您可以通过 less 进行管道传输。
col -bp typescript | less -R
在某些系统上col
不会接受文件名参数,请改用此语法:
col -bp <typescript | less -R
答案2
cat typescript | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > typescript-processed
以下是对字符串输入的一些解释perl
:
s/pattern//g
表示对整个输入字符串进行替换(该g
选项表示执行整个替换,而不是在第一次替换时停止)
以下是正则表达式模式的一些解释:
\e
匹配特殊的“转义”控制字符 (ASCII 0x1A)(
并且)
是群的开始和结束|
表示该组可以匹配 N 个模式中的一个。其中 N 个模式是[^\[\]]
或者\[.*?[a-zA-Z]
或者\].*?\a
[^\[\]]
方法- 匹配一组非字符,其中非字符
[
是]
- 匹配一组非字符,其中非字符
\[.*?[a-zA-Z]
方法- 匹配以 开头的字符串,
[
然后执行非贪婪操作,.*?
直到第一个字母字符
- 匹配以 开头的字符串,
\].*?\a
方法- 匹配以开头的字符串,
]
然后进行非贪婪操作,.*?
直到遇到称为“警报(铃声)字符”的特殊控制字符
- 匹配以开头的字符串,
答案3
我用cat filename
它来删除控制字符:-)
答案4
对于大量的script
输出,我会反复修改 perl 脚本。否则就用好的编辑器手动编辑。
目前不太可能存在一种自动方法,能够从script
输出中删除控制字符,从而重现某些重要时刻屏幕上显示的内容(例如,当主机正在等待该第一的一些用户输入的字符)。
例如,屏幕可能除了 之外一片空白Andrew $
,如果您随后输入rm /*
并按了十二次退格键(远远超过需要),那么最后屏幕上显示的内容取决于正在运行的 shell、您当前的stty
设置(您可能会在会话过程中更改这些设置)以及可能的其他一些因素。
以上适用于任何连续捕获输入和输出的自动化方法。主要的替代方法是在会话期间的适当时间进行“屏幕截图”或剪切和粘贴屏幕(这是我为用户指南、日记笔记等所做的)。