【问题标题】:searching in terminal logs在终端日志中搜索
【发布时间】:2014-03-30 01:52:12
【问题描述】:

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

这个问题与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 将通过完全删除 bar 来呈现文本(由用户使用 3 个退格键删除),完全如终端输出所示,而 cat 不会删除它。

[编辑]这里是另一个例子,表明提议的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

即使cat terminal_log.txt 没有显示bar(由于终端序列而隐藏),我们也得到2 而不是0。 所以实用程序col -b 不处理诸如清除等终端命令。 我正在寻找的是一个实用程序,可以准确呈现终端上显示的内容。

【问题讨论】:

  • 考虑用grep -c bar替换grep bar|wc -l

标签: bash terminal grep render


【解决方案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 打字稿文件,其中我只在屏幕上做了一个 clearcat 该文件,我可以滚动查看整个文件 - 不会删除任何行。

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

现在,假设您只对依赖于 xterm 的行为感到满意,则可以编写一个脚本来搜索此转义序列并删除打字稿文件中 $LINES 之前的行数。但是,这并不可靠,因为自运行 script 以来终端可能已调整大小,而 $LINES 将不正确。要删除的行数似乎没有编码到转义序列中。

【讨论】:

  • 添加了带有clear 的测试用例以表明这还不够。
  • 此外,即使是退格,这似乎也不起作用:$ echo zob&lt;BACKSPACE&gt;&lt;BACKSPACE&gt;&lt;BACKSPACE&gt;baz 然后cat terminal_log.txt | col -b 返回$ echo zoKbaz 而不是$ echo baz
  • @timotheecour - 查看我的编辑;我试图解释为什么这对于clear 来说可能是不可能的。
  • @timotheecour - 是的,你是对的 - 我认为 col -b 只是删除了 \b 字符,但并非所有最终出现在打字稿文件中的相关转义字符。我想这需要更多的工作/研究。
  • 我不明白clear 怎么可能删除日志文件,该文件只会被附加(AFAIK)。我试过 xterm(在 osx 上);键入 clear 只会滚动到顶部,因此看起来好像行已被删除,但显然写入日志文件的所有内容仍然存在,如可以通过 cat terminal_log.txt|wc -l 显示的那样。
【解决方案2】:

我发现了一种在某种程度上实现这一目标的非常老套的方法,并且可以完全编写脚本(至少在 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),这是一种常见情况。它不适用于 clear 以某种方式(例如在 xterm 上),因为 clear 只会将光标移动到终端顶部,但终端仍然是可滚动的(与擦除/操作光标的命令不同)。

很明显某事是可能的。 有什么改善的方法吗? 有什么办法摆脱applescript? linux上呢?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2021-07-23
    • 2020-05-16
    • 2011-04-22
    相关资源
    最近更新 更多