#author("2020-06-08T21:19:26+09:00","","")
#author("2020-06-09T11:41:54+09:00","","")
#navi(../)
* シフトJISのログをtailしたい [#b50993ba]
Windowsで出力されるShift_JISのログをCygwinのtailコマンドで監視したい。~
しかし、文字化けしてしまう。~
この様な場合の対処方法です。

#contents

* 関連記事 [#b9b529ab]
-[[Cygwinにnkfをインストールする方法>開発ツール/Cygwinにnkfをインストールする方法]]
-[[tailコマンドで新規作成や削除されるファイルの監視方法>https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/tail%E3%81%A7%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90%E3%82%84%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%9B%A3%E8%A6%96%E6%96%B9%E6%B3%95]]
-[[PowerShellでheadとtailを実現する>PowerShell/PowerShellでheadとtailを実現する]]


//#htmlinsert(win-top.html)

* 動作確認環境 [#dd3a7e24]
-Cygwin
 $ uname -a
 CYGWIN_NT-10.0 WINPC 3.1.5(0.340/5/3) 2020-06-01 08:59 x86_64 Cygwin
- Windows 10 ver.1909


* iconvを使用する [#ae3ea453]
iconvコマンドは文字コードを変換するコマンドになります。~
バッファリングされてしまうので以下のように記述します。
 tail -F ログファイル名 | while read L
 do
   echo $L | iconv -f SJIS -t UTF-8
   echo $L | iconv -f CP932 -t UTF-8
 done
一行で書くと以下のようになります。
  tail -F ログファイル名.txt | while read L; do echo $L | iconv -f SJIS -t UTF-8; done
  tail -F ログファイル名.txt | while read L; do echo $L | iconv -f CP932 -t UTF-8; done

変換文字コードを CP932 にしています。~
SJISでも同等に動作しますが、NEC,IBMが拡張した文字が非対象となります。~
詳細は以下のリンクを参照してください。
-[[Shift_JIS と Windows-31J (MS932) の違いを整理してみよう>https://weblabo.oscasierra.net/shift_jis-windows31j/]]


* nkfを使用する [#h351541d]
Cygwinの場合は、nkfコマンドがないのでソースからコンパイルして使用します。~
nkfの入手とコンパイルは以下の記事を参考にしてください。
-[[Cygwinにnkfをインストールする方法>開発ツール/Cygwinにnkfをインストールする方法]]

nkfコマンドを使った場合は、以下のようになります。~
文字コードは自動判別するので、以下の記述で動作すると思います。
 tail -F ログファイル名 | nkf -u
オプションの -u はバッファリングしない指定となります。~

文字コードを明示的に指定する場合は、以下のようになります。
 tail -F ログファイル名 | nkf -u -S -w

以上、シフトJISのログファイルをUTF-8に変換して表示する方法でした。

#htmlinsert(win-btm.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS