对非标准编码的文件使用“less”分页器

对非标准编码的文件使用“less”分页器

我经常使用less分页器查看日志文件。通常我使用它less -F来跟踪日志的进度tail

但是,有些日志文件使用非标准编码的国家字符(Latin-1,而系统使用UTF-8)。显然,这些字符将无法正确显示。

我如何使用 查看此类文件less

我发现的唯一解决方案是:

  • 更正文件的编码(recodeiconv)。当文件仍在写入时,这不起作用,因此不允许我使用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 将会:

  1. 定位到输入的末尾
  2. 循环读取并更新显示,直到按下 Ctrl-C

如果输入是管道,则 1. 将不会返回,直到管道发出 EOF 信号。如果我使用tail -f xx|less,管道将永远不会发出 EOF 信号,因此挂起的情况更少 :-(。

不过我确实找到了一种方法来得到我想要的东西:

 tail -f inputfile | recode latin1.. > /tmp/tmpfile

然后

less +F /tmp/tmpfile

这会起作用,因为它可以让 less +F 处理真实文件。这仍然有点尴尬,因为recode显然只能处理 4096 字节块中的数据,但它确实有效……

答案2

有可能正在recode缓冲管道中的输出,因此只有当缓冲区(可能是 4K)已满时,输出才会通过。您可以尝试使用unbuffer附带的脚本expect

相关内容