Verwenden Sie für Dateien mit nicht standardmäßiger Codierung den Pager "less"

3

Ich benutze oft den lessPager, um Logfiles anzusehen. Normalerweise benutze ich less -F, um den Fortschritt des Protokolls à la zu verfolgen tail.

Einige Protokolldateien verwenden jedoch nationale Zeichen in einer nicht standardmäßigen Codierung (Latin-1, während das System UTF-8 verwendet). Offensichtlich werden diese nicht korrekt angezeigt.

Wie kann ich solche Dateien mit anzeigen less?

Die einzigen Lösungen, die ich gefunden habe:

  • Korrigieren Sie die Kodierung der Datei ( recodeoder iconv). Dies funktioniert nicht, solange die Datei noch geschrieben wird. Ich kann sie daher nicht verwenden less -F. Außerdem werden die ursprünglichen Zeitstempel der Protokolldateien zerstört, was aus Sicht der Überwachung schlecht ist.
  • Benutze eine Pfeife ( recode latin1... |less). Funktioniert für laufende Dateien, less -Fscheint aber dann leider nicht zu funktionieren (es wird nur nicht aktualisiert; ich glaube, der recodeProzess wird beendet, sobald er abgeschlossen ist).

Gibt es eine Lösung, mit der ich eine Protokolldatei "abfangen" und trotzdem die nationalen Zeichen korrekt anzeigen kann?

sleske
quelle
Es sieht so aus, man lessals gäbe es einen Präprozessor, den Sie möglicherweise einstellen könnten, um Ihre Kodierung zu korrigieren.
Isomorphismen
@isomorphismes: Ja, lessunterstützt das Aufrufen eines Präprozessors. Soweit ich das beurteilen kann, liest der Präprozessor die Eingabedatei und erstellt eine neue Datei für less, sodass dies nicht funktionieren würde less -F.
sleske

Antworten:

3

Hm, das lesskann ich anscheinend nicht. Der Teil in less 'Sourcecode, der das Folgende implementiert, scheint zu sein:

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;

Nach meinem (eingeschränkten) Wissen über C bedeutet dies, dass wenn "Folgen" aktiviert ist, weniger wird:

  1. suche bis zum ende der eingabe
  2. Lesen und aktualisieren Sie die Anzeige in einer Schleife, bis Strg-C gedrückt wird

Wenn die Eingabe ein Pipel ist, wird 1. nicht zurückgegeben, bis die Pipe EOF signalisiert. Wenn ich benutze tail -f xx|less, signalisiert die Pipe niemals EOF, so dass weniger hängt :-(.

Ich habe jedoch einen Weg gefunden, um zu bekommen, was ich will:

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

dann

less +F /tmp/tmpfile

Dies funktioniert, da weniger + F für eine echte Datei verwendet werden kann. Es ist immer noch etwas umständlich, weil recodeanscheinend nur Daten in Blöcken von 4096 Bytes verarbeitet werden, aber es funktioniert ...

sleske
quelle
1

Es ist möglich, dass die recodeAusgabe in der Pipe gepuffert wird, sodass die Ausgabe nur erfolgt, wenn der Puffer (wahrscheinlich 4 KB) voll ist. Sie können versuchen, das unbuffermitgelieferte Skript zu verwenden expect.

Dennis Williamson
quelle
Nein, das ist nicht das Problem. Der recodeProzess wird einfach beendet, nachdem EOF für die Datei erkannt wurde (es kann schließlich nicht festgestellt werden, dass die Datei noch wächst). Ich kann dies mit bestätigen ps. Also Unbuffer hilft nicht.
Sleske
@sleske: Hast du es versucht tail -f | recode ... | less -F?
Dennis Williamson
@Dennis: Eigentlich ja, ich habe es versucht, aber es hat auch nicht geholfen. Es scheint less -Feinfach nicht auf Rohren zu funktionieren. Auch tail -f myfile | less -Ffunktioniert nicht, obwohl in diesem Fall beide Prozesse am Leben bleiben.
Sleske
Wie auch immer, +1 für gute Tipps. Auch wenn sie nicht funktioniert haben, ist es gut zu wissen, dass :-).
Sleske
1
@sleske: Übrigens less +Ffolgt das tail -feher Dateien wie (als less -F). Nach einigen Tests sieht es so aus recode, als würde eine Pufferung durchgeführt, die nicht kontrolliert werden kann. Dies funktioniert, aber die Ausgabe erfolgt in Blöcken:tail -f inputfile | recode ... | less +F
Dennis Williamson
0

Literaturempfehlung: Der Abschnitt NATIONAL CHARACTER SETSin

Linux / Unix-Befehl: weniger

Harrymc
quelle
das oder 'env LC_ALL = en_US.LATIN1 weniger -F-Datei'
akira
Das löst mein Problem nicht. Dadurch werden lessLatin-1-Zeichen als reguläre Zeichen akzeptiert (was bedeutet, dass sie nicht hervorgehoben werden), sie werden jedoch in einem Terminalprogramm, das UTF-8 erwartet, weiterhin falsch angezeigt (da dies die Standardeinstellung des Systems ist). Ich möchte die Latin-1-Zeichen tatsächlich in gültiges UTF-8 konvertieren und sie nicht nur als Junk / Box-Zeichen anzeigen lassen.
Sleske
@sleske: Ich kenne keine Möglichkeit, dynamische Dateien gleichzeitig zu konvertieren und weniger zu tun. Für die verschiedenen möglichen Kodierungen, die Sie haben, können Sie Makros pro Akiras Kommentar definieren. Dies setzt voraus, dass Ihr Problem nur die Anzeige und nicht die reine Konvertierung ist.
Harrymc