是否有工具健壮地呈现带有转义序列的文本(例如终端日志)?
此问题与render text with escape squence (like a terminal)有关 (我对这个问题的编辑被拒绝了,所以我在这里发布了一个新的用例和一个具体的新用例;上述问题的答案未能解决这个用例)。
例如,我想在终端日志中搜索字符串,只搜索实际显示的字符串,例如:
$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
不会处理终端命令,例如清除等。
我正在寻找的是一种可以准确呈现终端上显示内容的实用程序。
答案 0 :(得分:1)
解析退格所需的命令是col -b
。 I found it here.
$ 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
的行为感到满意,则可以编写一个脚本来搜索此转义序列,并在打字稿中删除$LINES
行之前的行数文件。然而,这并不健全,因为自script
运行以来终端可能已调整大小,$LINES
将不正确。要删除的行数似乎不会编码到转义序列中。
答案 1 :(得分:0)
我发现了一种在某种程度上实现这一目标非常hacky的方法,并且可以完全编写脚本(至少在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; CMD + C之前保存pbpaste,然后将其恢复以避免修改剪贴板。
实际上这适用于删除/操作终端缓冲区/光标的命令(例如:tput cuu 1; tput el
或退格或less
后跟q
)这是常见的情况。它不能以某种方式清除(例如在xterm上),因为clear仅将光标移动到终端顶部但终端仍然可滚动(与擦除/操作光标的命令不同)。
很明显某些东西是可能的。 有什么方法可以改善? 有什么办法摆脱苹果? 在linux上怎么样?