Verwenden Sie den Pager "less" mit einer nicht standardmäßigen Kodierung

4659
sleske

Ich verwende den lessPager häufig zum Anzeigen von Protokolldateien. Normalerweise less -Fverfolge ich den Fortschritt des Protokolls à la tail.

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

Wie kann ich solche Dateien 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, daher darf ich sie nicht verwenden less -F. Außerdem zerstört es den ursprünglichen Zeitstempel der Protokolldateien, was aus Sicht der Überwachung schlecht ist.
  • Benutze eine Pfeife ( recode latin1... |less). Funktioniert für laufende Dateien, less -Fscheint aber leider nicht zu funktionieren (es wird einfach nicht aktualisiert; ich glaube, der recodeProzess wird beendet, sobald er fertig ist).

Gibt es eine Lösung, mit der ich ein Logfile "abschließen" kann und trotzdem die nationalen Zeichen korrekt angezeigt werden?

3
Es sieht von 'Mann weniger' aus, als gäbe es einen Präprozessor, den Sie möglicherweise einstellen könnten, um Ihre Kodierung zu korrigieren. isomorphismes vor 6 Jahren 0
@isomorphismes: Ja, "less" unterstü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 für "less--F" nicht funktioniert. sleske vor 6 Jahren 0

3 Antworten auf die Frage

3
sleske

Hm, lesskann das offenbar nicht tun. Der Teil in less 'Quellcode, 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; 

Was mein (begrenztes) Wissen von C betrifft, bedeutet dies, dass bei aktiviertem "follow" weniger Wille gilt:

  1. bis zum Ende der Eingabe suchen
  2. Lesen und aktualisieren Sie die Anzeige in einer Schleife, bis Sie Strg-C drücken

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

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 wird funktionieren, da weniger + F an einer echten Datei arbeiten kann. Es ist immer noch etwas umständlich, da recodeanscheinend nur Daten in Blöcken von 4096 Bytes verarbeitet werden, aber es funktioniert ...

1
Dennis Williamson

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

Nein, das ist nicht das Problem. Der "recode" -Prozess wird einfach beendet, nachdem er EOF für die Datei erkannt hat (schließlich hat er keine Möglichkeit zu wissen, dass die Datei noch wächst). Ich kann das mit "ps" bestätigen. Also hilft Unpuffer nicht. sleske vor 13 Jahren 0
@sleske: Hast du `tail -f | ausprobiert? umkodieren ... | weniger -F` Dennis Williamson vor 13 Jahren 0
@Dennis: Eigentlich ja, ich habe es ausprobiert, aber es hat auch nichts geholfen. Es scheint, "weniger -F" funktioniert einfach nicht auf Pfeifen. Sogar `tail -f myfile | less -F` funktioniert nicht, obwohl in diesem Fall beide Prozesse am Leben bleiben. sleske vor 13 Jahren 0
Wie auch immer, +1 für gute Hinweise. Auch wenn sie nicht geklappt haben, ist es gut zu wissen :-). sleske vor 13 Jahren 0
@sleske: Übrigens, es ist `less + F`, das Dateien wie` tail -f` folgt (statt `less -F`). Nach einigen Tests sieht es so aus, als würde `recode 'eine Pufferung durchführen, die nicht kontrolliert werden kann. Dies funktioniert, aber die Ausgabe ist in Chunks: `tail -f inputfile | umkodieren ... | weniger + F` Dennis Williamson vor 13 Jahren 1
@Dennis: Interessant. Ihr Beispiel funktioniert für mich nicht: Weniger hängt nur mit einem leeren Bildschirm, bis ich Strg-C drücke, dann zeigt es seine Eingabeaufforderung, aber keinen Text. sleske vor 13 Jahren 0
Für mich scheint es eher so, dass "less + F" auf EOF wartet, bevor er überhaupt eine Eingabeaufforderung zeigt. Da das nie kommt, scheint es zu hängen. Einfach nur 'tail -f inputfile | Weniger funktioniert, bleibt aber hängen, wenn ich Shift-F (oder Shift-G) anrufe. Es scheint also, was ich will, ist mit weniger nicht möglich ... sleske vor 13 Jahren 0
@sleske: Versuchen Sie "less" in dieser Pipeline ohne Optionen: `tail -f inputfile | umkodieren ... | weniger ". Hinweis: Wenn Ihre Protokolldatei keinen großen Datenverkehr erhält, kann es eine Weile dauern, bis der Puffer voll ist und alles ausgegeben wird. Dennis Williamson vor 13 Jahren 0
@Dennis: Ja, ich habe es versucht und es funktioniert, aber es ist nicht praktisch. Es zeigt die Ausgabe an und gibt die weniger Eingabeaufforderung aus, sobald der erste Bildschirm mit Text gedruckt wurde. Wenn Sie jedoch bis zum Ende des Texts blättern, bleibt der Text weniger hängen, bis genügend neuer Text eingetroffen ist. und Shift-F oder Shift-G hängt immer noch weniger. Es scheint also, dass weniger nicht das kann, was ich gerne machen würde ... sleske vor 13 Jahren 0
0
harrymc

Vorgeschlagene Lektüre: Der Abschnitt NATIONAL CHARACTER SETSin

Linux / Unix-Befehl: weniger

das oder 'env LC_ALL = en_US.LATIN1 weniger -F-Datei' akira vor 13 Jahren 0
Das löst mein Problem nicht. Dies führt dazu, dass "less" Latin-1-Zeichen als reguläre Zeichen akzeptiert (dh sie werden nicht hervorgehoben), sie werden jedoch immer noch in einem Terminalprogramm falsch angezeigt, das UTF-8 erwartet (da dies die Standardeinstellung des Systems ist). Ich möchte die Latin-1-Zeichen tatsächlich in gültiges UTF-8 * umwandeln * und nicht nur als Junk- / Box-Zeichen anzeigen. sleske vor 13 Jahren 0
@sleske: Ich kenne keine Möglichkeit zum Konvertieren und mache weniger gleichzeitig für dynamische Dateien. Man kann Makros pro Kommentar für die verschiedenen möglichen Kodierungen definieren, die Sie haben. Dies setzt voraus, dass Ihr Problem nur die Anzeige und keine reine Konvertierung ist. harrymc vor 13 Jahren 0