在终端日志中搜索

时间:2014-02-26 22:30:46

标签: bash terminal grep render

是否有工具健壮地呈现带有转义序列的文本(例如终端日志)?

此问题与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不会处理终端命令,例如清除等。 我正在寻找的是一种可以准确呈现终端上显示内容的实用程序。

2 个答案:

答案 0 :(得分:1)

解析退格所需的命令是col -bI found it here.

$ 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实际上并没有删除任何行。相反,看起来在清除点处创建了某种锚,并且终端滚动使得锚位于终端窗口的顶部。如果向后滚动,您将看不到任何行已被删除。在这种情况下,如果我有script typescript文件,其中我只有一个clearcat该文件到屏幕,我可以滚动查看整个文件 - 没有行是删除。

因此,根据您使用的终端仿真器,您可能想要也可能不想删除行。

现在,假设您对仅依赖于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上怎么样?