私はよくless
ページャーを使用してログファイルを表示します。通常、私はless -F
を使用して、ログの進行状況をtail
で追跡します。
ただし、一部のログファイルは非標準エンコーディングで国別文字を使用します(Latin-1、システムはUTF-8を使用します)。明らかに、これらは正しく表示されません。
less
でそのようなファイルを表示するにはどうすればよいですか?
私が見つけた唯一の解決策:
recode
またはiconv
)。これは、ファイルがまだ書き込まれている間は機能しないため、less -F
を使用できません。さらに、ログファイルの元のタイムスタンプを破棄しますが、これは監査の観点からは不適切です。recode latin1... |less
)を使用します。進行中のファイルに対しては機能しますが、残念ながらless -F
は機能していないようです(更新されないだけです。完了したらrecode
プロセスは終了すると思います)。ログファイルを「テール」し、国別文字を正しく表示できるソリューションはありますか?
うーん、どうやらless
はこれを行うことができません。 「以下」を実装するlessのソースコードの部分は次のようです。
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;
私の(限られた)Cの知識に関する限り、これは、「フォロー」がアクティブになっている場合、以下のことを意味します。
入力がパイプの場合、1。パイプがEOFを通知するまで戻りません。 tail -f xx|less
を使用すると、パイプはEOFを通知しないため、ハングが少なくなります:-(。
しかし、私は欲しいものを手に入れる方法を見つけました:
tail -f inputfile | recode latin1.. > /tmp/tmpfile
その後
less +F /tmp/tmpfile
これは、実際のファイルでの+ Fの動作が少なくなるため機能します。 recode
は明らかに4096バイトのブロックのデータしか処理しないため、まだやや厄介ですが、機能します...
推奨読書:セクションNATIONAL CHARACTER SETS
in