我们有一个内部承包商来帮助进行一些产品配置,我们正在尝试查看他为我们设置的腻子日志,但他没有使用“可打印输出”,而是使用了“所有会话输出”,其中包括每个击键,包括“BS”等。由于他有很多很多的拼写错误,使得日志很难阅读。即:
[ESC]]0;root@host:~[BEL][root@host ~]# itm,cm[BS][BS][ESC][K[BS][ESC][Kcmd agent starp[BS]t
是否有某种方法可以智能地去除这些控制字符,以便最终结果是一个人类可读的文件,就像您在“可打印输出”格式中看到的一样?
感谢您的以下建议。我们的主要痛点是 [BS] 控制字符,这会导致:
ls -pg[BS][BS]al P[BS]| greu[BS]p dr
进入:
ls -al | grep dr
知道如何实现吗?
答案1
在 putty 中启用非常大的回滚,cat
日志文件,然后将结果复制并粘贴到新文件中。
答案2
尽管并不完美,但这个 sed 过滤器可以为您提供一个起点。
sed -r 's/(\[[A-Z]+\]?|\]0;)//g' escapes.log > noescapes.log
如果我将您的样本通过该过滤器,我会得到:
root@host:~[root@host ~]# itm,cmcmd agent starpt
依靠命令/脚本来解析实际终端代码的解决方案会更加优雅,这更像是一种“快速修复”。
对于那些正在尝试学习正则表达式的人来说,正则表达式的细分如下:
- 外括号用于交替(
|
字符为 OR) \[
和\]
是转义的方括号,因此它们不会被解释为字符类。[
]
包含一个字符类。[A-Z]
是用于匹配任何大写字母的类。+
表示匹配“一个或多个前一个原子”。前一个原子是字符类,因此是“一个或多个大写字母”。?
表示前一个原子是可选的。在本例中,可选原子是\]
。- 此时的组合含义是:“出现一个或多个大写字母,前面加上文字 [,后面也可以加上文字 ]”
- 该
|
字符是 OR 的开头。 \]0;
匹配“以 0; 为后缀的文字 ]”。
替换字符串为空,因此它们被删除。/g
告诉sed
不要在第一次匹配时停止。