Используйте пейджер `less` для файла с нестандартной кодировкой
Я часто использую less
пейджер для просмотра лог файлов. Обычно я использую less -F
следить за ходом журнала à la tail
,
Однако некоторые файлы журналов используют национальные символы в нестандартной кодировке (Latin-1, в то время как система использует UTF-8). Очевидно, они не будут отображаться правильно.
Как я могу просмотреть такие файлы с less
?
Единственные решения, которые я нашел:
- Исправьте кодировку файла (
recode
или жеiconv
). Это не работает, пока файл все еще пишется, поэтому не позволяет мне использоватьless -F
, Кроме того, он уничтожает исходную временную метку лог-файлов, что плохо с точки зрения аудита. - Используйте трубу (
recode latin1... |less
). Работает для файлов в процессе, но, к сожалению, тогдаless -F
не работает (просто не обновляется; я считаю, чтоrecode
процесс завершается, как только это будет сделано).
Любое решение, которое позволяет мне "хвост" лог-файл и по-прежнему правильно показывает национальные символы?
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", меньше будет:
- стремиться к концу ввода
- читать и обновлять отображение в цикле, пока не будет нажата Ctrl-C
Если вход представляет собой конвейер, 1. не вернется, пока труба не подаст сигнал EOF. Если я использую tail -f xx|less
Труба никогда не будет сигнализировать EOF, поэтому меньше зависает :-(.
Однако я нашел способ получить то, что хочу:
tail -f inputfile | recode latin1.. > /tmp/tmpfile
затем
less +F /tmp/tmpfile
Это будет работать, потому что это позволяет меньше + F работать с реальным файлом. Это все еще несколько неловко, потому что recode
по-видимому, только обрабатывает данные в блоках по 4096 байт, но это работает ...
Возможно, что recode
буферизует вывод в канале, поэтому вывод происходит только тогда, когда буфер, вероятно, 4K, заполнен. Вы можете попробовать использовать unbuffer
сценарий, который поставляется с expect
,
Предлагаемое чтение: раздел NATIONAL CHARACTER SETS
в