我经常使用less
分页器查看日志文件。通常我使用它less -F
来跟踪日志的进度tail
。
但是,有些日志文件使用非标准编码的国家字符(Latin-1,而系统使用UTF-8)。显然,这些字符将无法正确显示。
我如何使用 查看此类文件less
?
我发现的唯一解决方案是:
- 更正文件的编码(
recode
或iconv
)。当文件仍在写入时,这不起作用,因此不允许我使用less -F
。此外,它会破坏日志文件的原始时间戳,从审计角度来看,这是不好的。 - 使用管道 (
recode latin1... |less
)。适用于正在进行的文件,但不幸的是,它less -F
似乎不起作用(它只是没有更新;我相信recode
一旦完成,该过程就会退出)。
有什么解决方案可以让我“跟踪”日志文件并仍然正确显示国家字符?
答案1
嗯,显然less
不能这样做。less 源代码中实现“以下内容”的部分似乎是:
A_F_FOREVER:
/*
* Forward forever, ignoring EOF.
*/
if (ch_getflags() & CH_HELPFILE)
break;
cmd_exec();
jump_forw();
ignore_eoi = 1;
while (!sigs)
{
make_display();
forward(1, 0, 0);
}
ignore_eoi = 0;
就我对 C 语言的了解(有限)而言,这意味着如果激活了“follow”,less 将会:
- 定位到输入的末尾
- 循环读取并更新显示,直到按下 Ctrl-C
如果输入是管道,则 1. 将不会返回,直到管道发出 EOF 信号。如果我使用tail -f xx|less
,管道将永远不会发出 EOF 信号,因此挂起的情况更少 :-(。
不过我确实找到了一种方法来得到我想要的东西:
tail -f inputfile | recode latin1.. > /tmp/tmpfile
然后
less +F /tmp/tmpfile
这会起作用,因为它可以让 less +F 处理真实文件。这仍然有点尴尬,因为recode
显然只能处理 4096 字节块中的数据,但它确实有效……