3

Я часто использую less пейджер для просмотра лог-файлов. Обычно я использую less -F , чтобы следить за ходом журнала порционного tail

Однако некоторые файлы журналов используют национальные символы в нестандартной кодировке (Latin-1, в то время как система использует UTF-8). Очевидно, они не будут отображаться правильно.

Как я могу просматривать такие файлы с less?

Единственные решения, которые я нашел:

  • Исправьте кодировку файла (recode или iconv). Это не работает, пока файл все еще записывается, поэтому не позволяет мне использовать less -F . Кроме того, он уничтожает исходную временную метку лог-файлов, что плохо с точки зрения аудита.
  • Используйте канал (recode latin1... |less). Работает для файлов в процессе, но, к сожалению, less -F не работает (он просто не обновляется; я думаю, что процесс recode завершается, как только он завершен).

Любое решение, которое позволяет мне "хвост" лог-файл и по-прежнему правильно показывает национальные символы?

3 ответа3

3

Хм, видимо, 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", меньше будет:

  1. стремиться к концу ввода
  2. читать и обновлять отображение в цикле, пока не будет нажата Ctrl-C

Если вход представляет собой конвейер, 1. не вернется, пока труба не подаст сигнал EOF. Если я использую tail -f xx|less , канал никогда не будет сигнализировать EOF, поэтому less зависает :-(.

Однако я нашел способ получить то, что хочу:

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

затем

less +F /tmp/tmpfile

Это будет работать, потому что это позволяет меньше +F работать с реальным файлом. Это все еще несколько неловко, потому что recode очевидно, только обрабатывает данные в блоках по 4096 байт, но это работает ...

1

Возможно, что recode буферизует вывод в канале, поэтому вывод происходит только тогда, когда буфер, вероятно, 4K, заполнен. Вы можете попробовать использовать сценарий unbuffer который идет с expect.

0

Предлагаемое чтение: раздел NATIONAL CHARACTER SETS в

Команда Linux / Unix: меньше

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .