Use pager 'less' no arquivo com codificação não padrão

3

Costumo usar o pager less para visualizar arquivos de log. Normalmente eu uso less -F para acompanhar o progresso do log à la tail .

No entanto, alguns arquivos de log usam caracteres nacionais em uma codificação não padrão (Latin-1, enquanto o sistema usa UTF-8). Obviamente, estes não serão exibidos corretamente.

Como posso visualizar esses arquivos com less ?

As únicas soluções que encontrei:

  • Corrija a codificação do arquivo ( recode ou iconv ). Isso não funciona enquanto o arquivo ainda está sendo gravado, portanto, não me permite usar less -F . Além disso, ele destrói o timestamp original dos arquivos de log, o que é ruim do ponto de vista da auditoria.
  • Use um canal ( recode latin1... |less ). Funciona para arquivos em andamento, mas infelizmente, em seguida, less -F parece não funcionar (apenas não atualiza; acredito que o processo recode é encerrado assim que é feito).

Alguma solução que me permita "arrastar" um arquivo de log e ainda mostre os caracteres nacionais corretamente?

    
por sleske 28.06.2010 / 11:16

3 respostas

3

Hm, aparentemente less não pode fazer isso. A parte em menos 'código-fonte que implementa o' seguinte 'parece ser:

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;

No que diz respeito ao meu conhecimento (limitado) de C, isso significa que se "seguir" for ativado, menos será:

  1. buscar o final da entrada
  2. leia e atualize a exibição em um loop, até que Ctrl-C seja pressionado

Se a entrada for um pipel, 1. não retornará até que o tubo sinalize EOF. Se eu usar tail -f xx|less , o pipe nunca sinalizará EOF, portanto menos trava: - (.

No entanto, encontrei uma maneira de conseguir o que quero:

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

então

less +F /tmp/tmpfile

Isso funcionará, porque permite que menos + F funcionem em um arquivo real. Ainda é um pouco estranho, porque recode aparentemente processa dados em blocos de 4096 bytes, mas funciona ...

    
por 05.07.2010 / 00:46
1

É possível que recode esteja armazenando em buffer a saída no canal, então a saída só ocorre quando o buffer, provavelmente 4K, está cheio. Você pode tentar usar o script unbuffer que vem com expect .

    
por 28.06.2010 / 13:23
0

Sugestão de leitura: a seção NATIONAL CHARACTER SETS em

Comando Linux / Unix:

    
por 28.06.2010 / 11:22