Linuxコマンドで日本語が文字化けする原因と対処方法まとめ

  • URLをコピーしました!
目次

はじめに

Linuxで sedgrepawk を使って日本語を処理すると、文字化け が起こることがあります。
英語しか扱わない場合は気になりませんが、日本語ログや設定ファイルを扱う現場ではよく出くわす問題です。

文字化けの主な原因は以下の2点です。

  1. ロケール(locale)設定の不一致
  2. ファイルの文字コード(Shift_JIS / EUC-JP / UTF-8)の不一致

この記事では、よくある文字化けのパターンをコマンドごとに整理し、解決方法を解説します。

1. 共通の原因と確認方法

ロケールの確認

locale

出力例(悪い例):

LANG=C
LC_CTYPE="C"

CPOSIX では日本語が扱えません。

ファイルの文字コード確認

file sample.txt

出力例:

sample.txt: Shift_JIS text

→ UTF-8以外の文字コードなら変換が必要です。

2. sedでの文字化け

症状例

$ echo "こんにちは" | sed 's/こん/HELLO/'
HELLO�����

解決策

  1. ロケールをUTF-8に設定 export LANG=ja_JP.UTF-8 export LC_ALL=ja_JP.UTF-8
  2. ファイルをUTF-8に変換 iconv -f SHIFT_JIS -t UTF-8 sample.txt > sample_utf8.txt

3. grepでの文字化け

症状例

$ grep "日本語" sample.txt
grep: warning: invalid multibyte character

解決策

  • ロケールをUTF-8に変更
  • ファイルを iconv でUTF-8に統一

実践例

$ iconv -f EUC-JP -t UTF-8 sample.txt | grep "日本語"
日本語の行が正しくヒット

4. awkでの文字化け

症状例

$ echo "日本語テスト" | awk '{print length($0)}'
14

本来「6文字」と数えるべきところが「14バイト」として扱われています。

解決策

  • GNU Awk(gawk)を使用する
  • --posix--lint は外す(マルチバイト非対応になる)
  • 環境変数でロケールをUTF-8にする

実践例

$ export LANG=ja_JP.UTF-8
$ echo "日本語テスト" | gawk '{print length($0)}'
6

5. 共通の根本解決法

  • ロケールは常に UTF-8 に統一する export LANG=ja_JP.UTF-8 export LC_ALL=ja_JP.UTF-8
  • ファイルはUTF-8に変換してから処理する iconv -f SHIFT_JIS -t UTF-8 in.txt > out.txt
  • awkはgawkを使う(古いawkはマルチバイト非対応が多い)

まとめ

  • sed → 文字化けはロケールとファイル文字コードの不一致が原因
  • grep → エラーメッセージが出たら iconv で変換
  • awk → マルチバイト未対応の実装に注意、gawk推奨

👉 文字化けは「コマンドのバグ」ではなく、
環境設定と文字コードの違いが原因 です。

現場でよく使う対処フローは以下のとおりです。

  1. locale で環境を確認
  2. file で文字コードを確認
  3. export LANG=ja_JP.UTF-8 でUTF-8化
  4. 必要なら iconv で変換

これを覚えておけば、sed/grep/awkすべてに応用できます。

目次