是否有一种工具可以稳健地使用转义序列(例如终端日志)渲染文本?
这个问题与使用escape-squence(类似于终端)渲染文本有关(我对那个问题的编辑被拒绝了,所以我在这里发布了一个新的问题,并附上了一个具体的新用例;上面问题的答案未能解决这个用例)。
例如,我想在终端日志中搜索字符串,只搜索实际显示的字符串,例如:
$script terminal_log.txt
logging to terminal_log.txt
$echo bar<BACKSPACE><BACKSPACE><BACKSPACE>foo
foo
$cat terminal_log.txt|grep -c bar
1
$cat terminal_log.txt|sometool|grep -c bar
0
sometool将通过完全删除条(用户用3个退格删除了条)来呈现文本,正如终端输出中所示,而cat不会删除它。
[edit]这里有另一个例子表明所提出的col -b
不起作用:
$echo bar
bar
$clear
#the screen is cleared
$cat terminal_log.txt
#nothing shown, in particular no bar
$cat terminal_log.txt|col -b|grep -c bar
2
我们得到2而不是0,即使cat terminal_log.txt
没有显示bar
(由于终端序列而被隐藏)。因此,实用程序col -b
不处理诸如清除等终端命令。我要找的是一个实用程序,它可以准确地呈现终端上显示的内容。
解析退格所需的命令是col -b
。我在这里找到的。
$ cat terminal_log.txt | col -b | grep -c bar
0
$
解析clear
要困难得多,尤其是以稳健、便携、独立于终端的方式。我正在尝试使用两个不同的终端模拟器-传统的xterm
和gnome-terminal
(Ubuntu 12.04)。在这两种情况下,clear
似乎都会发出转义序列:
1b5b 481b 5b32 4a1b 5d30 3b75
但终端模拟器对此的解释不同:
xterm
,确实像您描述的那样清除了屏幕——之前的24行左右将从滚动缓冲区中删除- 然而,
gnome-terminal
实际上并没有删除任何行。相反,似乎在清除点创建了某种锚,并且终端滚动,使得锚位于终端窗口的顶部。如果您向后滚动,您将看到根本没有删除任何行。在这种情况下,如果我有script
typescript文件,其中我只做了一个clear
,并且cat
将该文件显示到屏幕上,我可以滚动查看整个文件-不会删除任何行
因此,根据您使用的终端模拟器,您可能想要或根本不想要删除行。
现在,假设您只对依赖于xterm
的行为感到满意,那么就可以编写一个脚本来搜索这个转义序列,并删除typescript文件中$LINES
之前的行数。然而,这是不稳健的,因为自从script
运行以来,终端可能已经被调整了大小,并且$LINES
将是不正确的。要删除的行数似乎没有编码到转义序列中。
我发现了一种在一定程度上实现这一点的非常巧妙的方法,并且可以完全编写脚本(至少在OSX上;请为linux贡献力量)。
给定文件$file
(例如terminal_log.txt):
render_control_chars $file
执行以下操作:
1. open a new terminal window T via applescript
2. cat $file
3. call applescript to CMD+A;CMD+C (copy all to clipboard)
4. a=$(pbpaste)
5. close T via applescript
6. cat $a to stdout
此外,我们可以在调用CMD+A之前保存pbpaste;CMD+C,然后将其还原以避免修改剪贴板。
实际上,这适用于擦除/操作终端缓冲区/光标的命令(例如:tput cuu 1; tput el
或退格或less
后面跟着q
),这是一种常见的情况。它在某种程度上不适用于clear(例如在xterm上),因为clear只将光标移动到终端的顶部,但终端仍然可以滚动(不像擦除/操纵光标的命令)。
很明显,某些是可能的。有什么改进的方法吗?有办法去掉苹果酱吗?在linux上怎么样?