web-dev-qa-db-ja.com

非標準エンコーディングのファイルで `less`ページャーを使用する

私はよくlessページャーを使用してログファイルを表示します。通常、私はless -Fを使用して、ログの進行状況をtailで追跡します。

ただし、一部のログファイルは非標準エンコーディングで国別文字を使用します(Latin-1、システムはUTF-8を使用します)。明らかに、これらは正しく表示されません。

lessでそのようなファイルを表示するにはどうすればよいですか?

私が見つけた唯一の解決策:

  • ファイルのエンコーディングを修正します(recodeまたはiconv)。これは、ファイルがまだ書き込まれている間は機能しないため、less -Fを使用できません。さらに、ログファイルの元のタイムスタンプを破棄しますが、これは監査の観点からは不適切です。
  • パイプ(recode latin1... |less)を使用します。進行中のファイルに対しては機能しますが、残念ながらless -Fは機能していないようです(更新されないだけです。完了したらrecodeプロセスは終了すると思います)。

ログファイルを「テール」し、国別文字を正しく表示できるソリューションはありますか?

3
sleske

うーん、どうやら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. 入力の最後までシーク
  2. ctrl-Cが押されるまで、ループで表示を読み取り、更新します

入力がパイプの場合、1。パイプがEOFを通知するまで戻りません。 tail -f xx|lessを使用すると、パイプはEOFを通知しないため、ハングが少なくなります:-(。

しかし、私は欲しいものを手に入れる方法を見つけました:

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

その後

less +F /tmp/tmpfile

これは、実際のファイルでの+ Fの動作が少なくなるため機能します。 recodeは明らかに4096バイトのブロックのデータしか処理しないため、まだやや厄介ですが、機能します...

3
sleske

recodeがパイプ内の出力をバッファリングしている可能性があるため、出力はバッファ(おそらく4K)がいっぱいになったときにのみ送信されます。 unbuffer に付属の expect スクリプトを使用してみてください。

推奨読書:セクションNATIONAL CHARACTER SETS in

Linux/Unixコマンド:less

0
harrymc