我正在运行一个程序,该程序打印大量转义字符(例如“Esc[1A”,将光标向上移动一行),并尝试将输出重定向到日志文件。当我在没有重定向的情况下运行程序时,最终输出如下所示:
256 lines processed.
但是当我重定向到日志文件时,该文件最终看起来像这样:
Processing line 1...
Esc[1AProcessing line 2...
Esc[1AProcessing line 3...
...
Esc[1AProcessing line 256...
Esc[1A256 lines processed.
发生的情况是,在终端上,“Esc[1A”字符告诉光标后退,这样每个连续的行都会覆盖最后一行,最后只显示最后一行。
我希望日志文件的显示与程序的最终输出完全相同,无需重定向。我知道可以通过管道传输输出以col -bp
过滤掉转义字符,但我实际上想申请以便我的日志文件最终不会包含数千个无关的行。我怎样才能实现这个目标?
答案1
您必须在阅读时清除这些转义符 - 执行终端所做的操作并覆盖它们。
这模拟了您描述的输出seq
:
seq -s "
$(printf '\033[A')" 10
如果它写入解释该转义的终端,它将看起来仅打印10
。但正如您在问题中指出的那样,它实际上是在逐个打印所有这些数字。但是,如果我用sed
以下方法过滤其输出:
seq -s "
$(printf '\033[A')" 10 |
sed -e :n -e "\$!N;s/.*$(printf '\033\[A')//;tn"
...它真的之所以打印只是10
因为sed
不断地读取下一行输入并s///
替换掉从模式空间的头部到最后出现的所有内容按键逃脱。每次成功时,它都会分支回标签:n
以t
再次尝试。