在终端日志中搜索



是否有一种工具可以稳健地使用转义序列(例如终端日志)渲染文本?

这个问题与使用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要困难得多,尤其是以稳健、便携、独立于终端的方式。我正在尝试使用两个不同的终端模拟器-传统的xtermgnome-terminal(Ubuntu 12.04)。在这两种情况下,clear似乎都会发出转义序列:

1b5b 481b 5b32 4a1b 5d30 3b75

但终端模拟器对此的解释不同:

  • xterm,确实像您描述的那样清除了屏幕——之前的24行左右将从滚动缓冲区中删除
  • 然而,gnome-terminal实际上并没有删除任何行。相反,似乎在清除点创建了某种锚,并且终端滚动,使得锚位于终端窗口的顶部。如果您向后滚动,您将看到根本没有删除任何行。在这种情况下,如果我有scripttypescript文件,其中我只做了一个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上怎么样?

最新更新