サーバー運用の現場では、こうした文字単位の変換や削除がたびたび発生します。
そんなときに使うのが tr コマンドです。sedやawkほど多機能ではありませんが、そのぶんシンプルで高速に動作するため、パイプラインの中で日常的に使われています。
この記事では、trコマンドの実践的な使い方を解説します。
大文字小文字の変換、不要な文字の削除、改行やスペースの処理など、実務で役立つパターンを具体的なコマンド例とともに紹介します。
実行環境:RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済み
【この記事でわかること】
・tr '[:upper:]' '[:lower:]' で大文字小文字を一括変換できる
・-d オプションで不要な文字を一括削除できる
・-s で連続スペースの圧縮やログ整形に使える
・改行の変換やWindows改行コードの除去もできる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
trコマンドとは?文字単位で変換・削除を行うコマンド
tr(translate characters)は、標準入力から受け取ったテキストに対して、文字単位の変換・削除・圧縮を行うコマンドです。基本的な構文は以下のとおりです。
tr [オプション] SET1 [SET2]
trコマンドの特徴をまとめると、次のようになります。
・標準入力のみ対応:ファイル名を引数に取れないため、catやリダイレクトと組み合わせて使う
・文字単位の処理:「abc」を「xyz」に変換する場合、a→x、b→y、c→zと1文字ずつ対応する
・正規表現は使えない:パターンマッチではなく、文字の1対1変換に特化している
sedとの違いを簡単に整理しておきましょう。sedは正規表現によるパターンマッチで文字列を置換しますが、trは文字を1文字ずつ別の文字に変換します。「ABCをすべて小文字にしたい」のような単純な文字変換はtrが適しており、「特定のパターンに一致する文字列を置き換えたい」場合はsedコマンドを使いましょう。
trコマンドの基本的な使い方
1. 大文字を小文字に変換する([:upper:] [:lower:])
最もよく使われるのが、大文字から小文字への変換です。POSIX文字クラスの[:upper:]と[:lower:]を使います。# 大文字を小文字に変換する $ echo "HELLO WORLD" | tr '[:upper:]' '[:lower:]' hello world
# 範囲指定で大文字→小文字に変換する $ echo "HELLO WORLD" | tr 'A-Z' 'a-z' hello world
2. 小文字を大文字に変換する
逆方向の変換も同じ要領です。ホスト名を大文字で表示したい場面などで使えます。# ホスト名を大文字に変換して表示する $ hostname | tr '[:lower:]' '[:upper:]' WEB-SERVER-01
# 変数の値を大文字に変換する $ ENV_NAME="production" $ echo "$ENV_NAME" | tr '[:lower:]' '[:upper:]' PRODUCTION
3. 特定の文字を別の文字に置換する
日付の区切り文字を変えたり、スペースをアンダースコアに置き換えたりする場合に使います。# 日付のハイフンをスラッシュに変換する $ echo "2026-04-09" | tr '-' '/' 2026/04/09
# スペースをアンダースコアに変換する(ファイル名の整形など) $ echo "Hello World" | tr ' ' '_' Hello_World
# 複数の文字を同時に変換する(a→x, b→y, c→z) $ echo "aabbcc" | tr 'abc' 'xyz' xxyyzz
4. 文字を削除する(-dオプション)
-d(delete)オプションを使うと、指定した文字をすべて削除できます。# 数字をすべて削除する $ echo "abc123def456" | tr -d '0-9' abcdef
# アルファベットをすべて削除する(数字だけを残す) $ echo "abc123def456" | tr -d '[:alpha:]' 123456
# 電話番号のハイフンを削除する $ echo "03-1234-5678" | tr -d '-' 0312345678
5. 連続する同じ文字を1つにまとめる(-sオプション)
-s(squeeze-repeats)オプションは、連続する同じ文字を1文字に圧縮します。# 連続する文字を1つにまとめる $ echo "aabbccdd" | tr -s 'a-z' abcd
# 連続するスペースを1つにまとめる $ echo "user1 10234 0.5 /usr/bin/httpd" | tr -s ' ' user1 10234 0.5 /usr/bin/httpd
# dfの出力からスペースを圧縮してcutで使用率だけ取り出す $ df -h / | tail -1 | tr -s ' ' | cut -d ' ' -f 5 42%
応用・実務Tips
6. 改行をスペースに変換する(ファイルを1行にまとめる)
複数行のテキストを1行にまとめたいときに、改行文字(\n)をスペースに変換します。# サーバーリストを1行にまとめる $ cat servers.txt web-01 web-02 db-01 $ cat servers.txt | tr '\n' ' ' web-01 web-02 db-01
# コロン区切りを改行に変換する(PATHの確認) $ echo "$PATH" | tr ':' '\n' /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
7. 補集合で指定文字以外を処理する(-cオプション)
-c(complement)オプションは、SET1の補集合(指定した文字以外のすべての文字)を対象にします。「残したい文字」を指定して、それ以外を削除・変換するという使い方です。# 数字だけを残す(数字以外を削除する) $ echo "abc123def456" | tr -cd '0-9' 123456
# アルファベットと数字だけを残す(改行も維持する) $ echo "abc123!@#def" | tr -cd '[:alnum:]\n' abc123def
8. パイプと組み合わせた実務パターン
trはパイプラインの中で他のコマンドと組み合わせることで真価を発揮します。障害対応やログ解析の現場でよく使うパターンを紹介します。CSVの区切り文字をタブに変換する
# CSVをTSV(タブ区切り)に変換する $ echo "name,age,city" | tr ',' '\t' name age city
Windowsで作成されたファイルには改行の前にCR(\r)が含まれています。これが原因でスクリプトが正常に動作しないことがあります。
# CRを除去してUnix形式の改行に変換する $ cat windows_file.txt | tr -d '\r' > unix_file.txt # CRが含まれているかどうかを確認する $ cat -A windows_file.txt | head -3 line1^M$ line2^M$ line3^M$
grepコマンドでフィルタした結果に対して、trで空白を整形してからcutで抽出するパターンです。
# アクセスログからステータスコード別に集計する $ grep "GET /api/" /var/log/httpd/access_log | tr -s ' ' | cut -d ' ' -f 9 | sort | uniq -c | sort -rn 847 200 123 304 34 404 5 500
# /dev/urandomからアルファベットと数字だけを取り出して16文字のパスワードを生成する $ cat /dev/urandom | tr -cd '[:alnum:]' | head -c 16; echo kR9mBx4TvLp2NqYf
9. trとsedの使い分け
trとsedはどちらもテキストを変換するコマンドですが、得意な処理が異なります。以下の基準で使い分けてください。| 比較項目 | tr | sed |
|---|---|---|
| 処理単位 | 1文字ずつ変換 | 文字列パターンで置換 |
| 正規表現 | 使えない | 使える |
| 入力 | 標準入力のみ | 標準入力+ファイル指定可 |
| 処理速度 | 高速(単純な文字変換) | やや遅い(パターンマッチ) |
| ファイルの直接編集 | できない | -iオプションで可能 |
・大文字小文字の一括変換
・特定の文字(記号、数字など)の削除
・改行やスペースの変換・圧縮
・区切り文字の変更(カンマ→タブなど)
sedを使う場面:
・「http://」を「https://」に変換するような文字列単位の置換
・正規表現を使ったパターンマッチが必要な処理
・ファイルを直接書き換えたい場合
・特定の行だけを対象にした処理
迷ったときは、「1文字を別の1文字に変えるならtr、それ以外はsed」と覚えておけば間違いありません。
「tr: extra operand」が出た時の対処法
trコマンドでよく遭遇するエラーが「extra operand」です。# クォートなしで実行するとエラーになる $ echo "Hello World" | tr [:upper:] [:lower:] tr: extra operand ']' Try 'tr --help' for more information.
対処法はシンプルで、SET1とSET2をシングルクォートで囲んでください。
# シングルクォートで囲めば正常に動作する $ echo "Hello World" | tr '[:upper:]' '[:lower:]' hello world
日本語(マルチバイト文字)を扱う場合の注意
trコマンドはバイト単位で処理を行う実装が多いため、日本語などのマルチバイト文字では期待どおりに動作しない場合があります。RHEL 9やUbuntu 24.04のGNU coreutils版trでは、LANGやLC_ALLにUTF-8ロケールが設定されていれば、全角アルファベットの大文字小文字変換にも対応しています。
# ロケール設定を確認する $ locale | grep LC_CTYPE LC_CTYPE="ja_JP.UTF-8"
もしCロケール(POSIX)になっている場合はASCII範囲のみの処理になります。マルチバイト文字を扱う際はUTF-8ロケールが設定されているか確認しましょう。
本記事のまとめ
trコマンドの主な使い方を一覧にまとめます。| やりたいこと | コマンド |
|---|---|
| 大文字→小文字に変換 | echo "TEXT" | tr '[:upper:]' '[:lower:]' |
| 小文字→大文字に変換 | echo "text" | tr '[:lower:]' '[:upper:]' |
| 特定の文字を置換 | echo "2026-04-09" | tr '-' '/' |
| 数字を削除 | echo "abc123" | tr -d '0-9' |
| 連続スペースを圧縮 | df -h | tr -s ' ' | cut -d ' ' -f 5 |
| 改行をスペースに変換 | cat file.txt | tr '\n' ' ' |
| 指定文字以外を削除 | echo "abc123" | tr -cd '[:alnum:]\n' |
| CRを除去(改行コード変換) | cat file.txt | tr -d '\r' > output.txt |
「1文字を別の1文字に変える」処理はtrに任せ、パターンマッチが必要な処理はsedに任せるという使い分けを意識してください。
テキスト処理をさらに深く学びたい方は、以下の記事もあわせて参照してください。
関連記事:
sedコマンドで文字列を置換する方法
awkコマンドの使い方
cutコマンドの使い方
grepコマンドで文字列を検索する方法
テキスト処理の基礎から体系的に学びませんか?
trコマンドはテキスト処理の基本ですが、grep・awk・sedと組み合わせて初めて現場で力を発揮します。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
