Ich benutze oft den less
Pager, 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 (
recode
odericonv
). Dies funktioniert nicht, solange die Datei noch geschrieben wird. Ich kann sie daher nicht verwendenless -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 -F
scheint aber dann leider nicht zu funktionieren (es wird nur nicht aktualisiert; ich glaube, derrecode
Prozess 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?
linux
character-encoding
less
pager
sleske
quelle
quelle
man less
als gäbe es einen Präprozessor, den Sie möglicherweise einstellen könnten, um Ihre Kodierung zu korrigieren.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ürless
, sodass dies nicht funktionieren würdeless -F
.Antworten:
Hm, das
less
kann ich anscheinend nicht. Der Teil in less 'Sourcecode, der das Folgende implementiert, scheint zu sein:Nach meinem (eingeschränkten) Wissen über C bedeutet dies, dass wenn "Folgen" aktiviert ist, weniger 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:
dann
Dies funktioniert, da weniger + F für eine echte Datei verwendet werden kann. Es ist immer noch etwas umständlich, weil
recode
anscheinend nur Daten in Blöcken von 4096 Bytes verarbeitet werden, aber es funktioniert ...quelle
Es ist möglich, dass die
recode
Ausgabe in der Pipe gepuffert wird, sodass die Ausgabe nur erfolgt, wenn der Puffer (wahrscheinlich 4 KB) voll ist. Sie können versuchen, dasunbuffer
mitgelieferte Skript zu verwendenexpect
.quelle
recode
Prozess 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ätigenps
. Also Unbuffer hilft nicht.tail -f | recode ... | less -F
?less -F
einfach nicht auf Rohren zu funktionieren. Auchtail -f myfile | less -F
funktioniert nicht, obwohl in diesem Fall beide Prozesse am Leben bleiben.less +F
folgt dastail -f
eher Dateien wie (alsless -F
). Nach einigen Tests sieht es so ausrecode
, 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
Literaturempfehlung: Der Abschnitt
NATIONAL CHARACTER SETS
inLinux / Unix-Befehl: weniger
quelle
less
Latin-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.