从GNU屏幕的屏幕日志中删除转义字符。%n


14

是否可以在GNU Screen的输出文件中删除ESC序列?颜色,制表符和其他转义字符之类的内容进入日志文件,并且变得难以解密。

我已经尝试过Google&Co.博士并阅读了该手册,但没有找到合适的方法...

也许我忽略了什么?

Answers:


11

尝试以下Perl魔术:

perl -ne 's/\x1b[[()=][;?0-9]*[0-9A-Za-z]?//g;s/\r//g;s/\007//g;print' < screenlog.0

谢谢你-太棒了!它仍然在那里^ G和^ M字符,但它是一个很多更具可读性...
shaond

1
将其添加到表达式中。
whitequark 2010年

我不知道那一根衬里有多少个ASCII面。我停止计数各地20
约翰牛逼

4
当然,我可以写另一个单线来计算它们。
whitequark'2

10

使用ansifilter。

ansifilter screenlog.txt > screenlog.txt.clean

是在每个linux系统中还是需要安装的东西?
Journeyman Geek

@JourneymanGeek它甚至不在Ubuntu仓库中,因此我想说它并不十分流行。看起来您必须自己从项目页面获取它,然后自己运行/编译。不会确切地称它为受欢迎的程序ansifilter.sourceforge.net
Simon Sheehan

我在OSX上使用,使用brew install ansifilter起来就像一种魅力。
thekingoftruth 2012年

1
自2012年发表有关发行的评论以来,我不知道这有什么变化,但是我在当前版本的Fedora(22)的回购中发现了这一点。
dmh 2015年

10

也尝试使用less的-r或-R选项。

less -r screenlog.0

不错的解决方案。它可以正确处理所有^ H(删除)字符,显示进度条,而没有^ M残留,甚至保留我的颜色提示!当然,有时显示日志是不够的。
Quantum13年

5

一旦在screenlog.n中捕获了会话,就可以将文件分类到终端,然后使用screen的hardcopy命令将cat的输出转储到文件中。结果将为您提供没有任何转义序列的干净输出。

唯一的“陷阱”似乎是要确保硬拷贝捕获回滚缓冲区中的所有内容,并且回滚缓冲区仅包含您要捕获的内容。

1. $ screen
2. $ cd /path/to/screenlog.n directory/
3. $ wc -l screenlog.n 
4. $ screen -X scrollback 245 # 245 is the number of lines found from your wc command + 5 
5. $ cat screenlog.n
6. $ screen -X hardcopy -h screenlog.n.cleaned 

请注意,-h确保您捕获整个回滚历史记录,而不仅仅是立即查看的内容

现在,screenlog.n.cleaned文件将包含cat输出的硬拷贝,并且将不包含任何转义序列


非常非常整洁。所有其他perl / sed / python一线软件对我来说都失败了。当想到-r / more更少直接处理我的文件时,这非常令人沮丧。一个建议wc -l对我没有用。它返回了28226,但在我的情况下确实需要33031。
2014年

4

我使用strings命令使屏幕日志可读。在Debian下,它是binutils软件包的一部分。

正如其手册页所述:

字符串-查找对象或其他二进制文件中的可打印字符串


2

如果您是screen用户,那么Joel Verks的帖子中建议的屏幕硬拷贝解决方案将是最好的-假设您在以下内容中定义了较大的回滚:.screenrc

defscrollback 10000

然后您将执行以下操作:

  1. 显示screenlog文件:

    $ cat screenlog.<screen_window_num>
    
  2. 使用hardcopy -h(请参阅屏幕手册页)将当前窗口内容及其回滚缓冲区保存到hardcopy.#文件中:

    <Escape key> (Ctrl-a by default)
    :hardcopy -h
    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.