Costumo usar o less
pager 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 (latino-1, enquanto o sistema usa UTF-8). Obviamente, eles não serão exibidos corretamente.
Como posso visualizar esses arquivos less
?
As únicas soluções que encontrei:
- Corrija a codificação do arquivo (
recode
ouiconv
). Isso não funciona enquanto o arquivo ainda está sendo gravado, portanto, não me permite usarless -F
. Além disso, destrói o registro de data e hora original dos arquivos de log, o que é ruim do ponto de vista da auditoria. - Use um cano (
recode latin1... |less
). Funciona para arquivos em andamento, mas infelizmenteless -F
não parece funcionar (ele simplesmente não é atualizado; acredito que orecode
processo é encerrado após a conclusão).
Alguma solução que me permita "arrastar" um arquivo de log e ainda mostrar caracteres nacionais corretamente?
linux
character-encoding
less
pager
sleske
fonte
fonte
man less
que existe um pré-processador que você pode definir para corrigir sua codificação.less
suporta a chamada de um pré-processador. No entanto, até onde eu sei, o pré-processador lê o arquivo de entrada e cria um novo arquivo paraless
, portanto, isso não funcionarialess -F
.Respostas:
Hm, aparentemente
less
não pode fazer isso. A parte no código-fonte menos que implementa o "seguinte" parece ser:Quanto ao meu conhecimento (limitado) de C, isso significa que se "follow" for ativado, menos será:
Se a entrada for um pipel, 1. não retornará até que o tubo sinalize EOF. Se eu usar
tail -f xx|less
, o tubo nunca sinalizará EOF, portanto menos trava :-(.No entanto, encontrei uma maneira de conseguir o que quero:
então
Isso funcionará, porque permite que menos + F funcionem em um arquivo real. Ainda é um pouco estranho, porque
recode
aparentemente apenas processa dados em blocos de 4096 bytes, mas funciona ...fonte
É possível que a
recode
saída seja armazenada em buffer no tubo, para que a saída só chegue quando o buffer, provavelmente 4K, estiver cheio. Você pode tentar usar ounbuffer
script que acompanhaexpect
.fonte
recode
processo simplesmente sai após detectar EOF para o arquivo (afinal, não há como saber que o arquivo ainda está crescendo); Eu posso confirmar isso usandops
. Então, o buffer não ajuda.tail -f | recode ... | less -F
?less -F
simplesmente não funciona em tubos. Mesmotail -f myfile | less -F
não funciona, embora neste caso ambos os processos permaneçam vivos.less +F
que segue arquivos comotail -f
(em vez deless -F
). Após alguns testes, parece querecode
está fazendo um buffer que não pode ser controlado. Isso funciona, mas a saída está em pedaços:tail -f inputfile | recode ... | less +F
Leitura sugerida: A seção
NATIONAL CHARACTER SETS
emComando Linux / Unix: menos
fonte
less
que os caracteres latinos-1 sejam aceitos como caracteres regulares (o que significa que não os destaca), mas eles ainda aparecerão incorretamente em um programa de terminal que espera UTF-8 (como esse é o padrão do sistema). Na verdade, quero converter os caracteres Latin-1 em UTF-8 válidos, e não apenas mostrá-los como caracteres de lixo / caixa.