3 votes

Utilisez le pager `less` sur un fichier avec un codage non standard

Je suis souvent le less pager pour visualiser les fichiers journaux. Généralement, j'utilise less -F pour suivre la progression du journal à la manière de tail.

Cependant, certains fichiers journaux utilisent des caractères nationaux dans un encodage non standard (Latin-1, alors que le système utilise UTF-8). Évidemment, ceux-ci ne s'afficheront pas correctement.

Comment puis-je visualiser de tels fichiers avec less ?

Les seules solutions que j'ai trouvées :

  • Corriger l'encodage du fichier (recode ou iconv). Cela ne fonctionne pas si le fichier est toujours en cours d'écriture, donc je ne peux pas utiliser less -F. De plus, cela détruit l'horodatage d'origine du journal, ce qui est préjudiciable du point de vue de l'audit.
  • Utiliser un tube (recode latin1... |less). Fonctionne pour les fichiers en cours, mais malheureusement, ensuite less -F ne semble pas fonctionner (il ne se met simplement pas à jour ; je pense que le processus recode se termine une fois qu'il a fini).

Existe-t-il une solution qui me permette de "suivre" un fichier journal tout en affichant correctement les caractères nationaux ?

3voto

sherbang Points 2675

Hm, apparemment less ne peut pas faire cela. La partie du code source de less qui implémente le "suivant" semble être :

A_F_FOREVER:
                        /*
                         * Suivre pour toujours, en ignorant 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;

D'après mes connaissances (limitées) en C, cela signifie que si "follow" est activé, less va :

  1. se déplacer à la fin de l'entrée
  2. lire et mettre à jour l'affichage en boucle, jusqu'à ce que Ctrl-C soit pressé

Si l'entrée est un pipeline, la 1. ne reviendra pas tant que le pipeline ne signalera pas EOF. Si j'utilise tail -f xx|less, le pipeline ne signalera jamais EOF, donc less reste bloqué :-(.

Cependant, j'ai trouvé un moyen d'obtenir ce que je veux :

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

ensuite

less +F /tmp/tmpfile

Cela fonctionnera, car cela permet à less +F de fonctionner sur un vrai fichier. C'est toujours un peu maladroit, car recode apparemment ne traite les données que par blocs de 4096 octets, mais ça marche...

1voto

Damian Powell Points 315

Il est possible que recode mette en mémoire tampon la sortie dans le tuyau, de sorte que la sortie ne se produit que lorsque le tampon, probablement de 4 ko, est plein. Vous pouvez essayer d'utiliser le script unbuffer fourni avec expect.

0voto

harrymc Points 394411

Lecture suggérée : la section ENSEMBLES DE CARACTÈRES NATIONAUX dans

Commande Linux / Unix : less

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X