Bashのコマンドライン操作において、テキストデータの整理や解析は日常的に発生する重要なタスクです。
その中でも「sort」コマンドは、ファイルの内容を行単位で並び替えるための非常に強力かつ汎用性の高いツールとして広く利用されています。
ログファイルの解析からCSVデータの集計まで、このコマンドを使いこなすことでデータ処理の効率は劇的に向上します。
本記事では、2026年現在のシステム管理や開発現場でも必須となる、sortコマンドの基本から応用テクニックまでを詳しく解説します。
Bashのsortコマンドとは
sortコマンドは、テキストファイルの内容を指定された順序で並び替え、その結果を標準出力に表示するプログラムです。
デフォルトでは、各行の先頭から文字コード順(通常は辞書順)で昇順に並び替えを行います。
このコマンドは、パイプラインを利用して他のコマンドの出力を受け取ることができるため、シェルスクリプト内でも多用されます。
単純な並び替えだけでなく、数値としての比較や、特定の列を基準にしたソートなど、高度なオプションが豊富に用意されています。
大規模なデータセットを扱う場合でも、効率的なアルゴリズムによって高速に処理を行うことが可能です。
sortコマンドの基本構文と主要オプション
sortコマンドの基本的な使い方は非常にシンプルで、コマンドの後にファイル名を指定するだけです。
# 基本的な使い方の例
sort sample.txt
実務で頻繁に使用される主要なオプションを以下の表にまとめました。
| オプション | 説明 |
|---|---|
| -n | 文字列ではなく「数値」として比較し並び替えます。 |
| -r | 昇順ではなく「降順(逆順)」で並び替えます。 |
| -k | 並び替えの基準となる「列(フィールド)」を指定します。 |
| -t | 列の区切り文字(デリミタ)を指定します。 |
| -u | 重複した行を取り除き、一意な行のみを表示します。 |
| -f | 大文字と小文字を区別せずに並び替えます。 |
| -h | 単位付きの数値(1K, 2M, 1Gなど)を考慮して並び替えます。 |
| -V | バージョン番号(1.2.1など)を適切に並び替えます。 |
数値としての並び替え(-nオプション)
デフォルトのsortコマンドは、数字も「文字列」として認識してしまいます。
例えば、「10」は「2」よりも辞書順では先に来てしまいますが、これは「1」が「2」より前にあるためです。
数値を正しく昇順で並び替えるには、必ず-nオプションを使用してください。
以下に、オプションの有無による違いを示すサンプルを記述します。
# 数値が含まれるデータの作成
cat <<EOF > numbers.txt
10
2
55
1
EOF
# オプションなし(辞書順)
sort numbers.txt
# 数値順でソート
sort -n numbers.txt
# オプションなしの結果
1
10
2
55
# -n オプションの結果
1
2
10
55
このように、計算結果やログの件数などを扱う場合は、-nの指定が不可欠です。
逆順での並び替え(-rオプション)
データを大きい順、あるいは降順で表示したい場合には、-r(reverse)オプションを使用します。
このオプションは他のオプションと組み合わせて使うことが一般的です。
例えば、数値の大きい順に並び替えたい場合は、-nrのように組み合わせて記述します。
# 数値の大きい順(降順)にソート
sort -nr numbers.txt
55
10
2
1
ランキングの表示や、ストレージ消費量が多い順のリスト作成などに役立ちます。
特定の列を指定して並び替える(-kオプション)
実務で扱うデータの多くは、複数の項目が並んだ表形式やCSV形式です。
sortコマンドの-kオプションを使用すると、特定の列をキーにして並び替えることが可能になります。
列の指定は「1」から始まるインデックスで行います。
複数列指定の基本
以下のサンプルデータを使用して、2列目(スコア)を基準に並び替える方法を見てみましょう。
# サンプルデータの作成(名前とスコア)
cat <<EOF > scores.txt
Alice 80
Bob 95
Charlie 70
Dave 95
EOF
# 2列目を数値として昇順ソート
sort -k 2,2n scores.txt
Charlie 70
Alice 80
Bob 95
Dave 95
-k 2,2nという指定は、「2列目から始まり2列目で終わる範囲を、数値(n)としてソートする」という意味になります。
優先順位を付けた複数列の指定
第1基準の列が同じ値だった場合に、第2基準の列で並び替えることも可能です。
例えば、「2列目を数値の降順で並び替え、同じスコアなら1列目を辞書順で並び替える」という複雑な指定も一行で記述できます。
# 2列目を数値降順、1列目を辞書順昇順
sort -k 2,2nr -k 1,1 scores.txt
Bob 95
Dave 95
Alice 80
Charlie 70
このように、-kオプションを複数回記述することで、詳細なソート条件を設定できます。
区切り文字の変更(-tオプション)
デフォルトでは、sortコマンドは「空白文字(スペースやタブ)」を列の区切りとして認識します。
しかし、CSVファイルのようにカンマで区切られたデータを扱う場合は、-tオプションで区切り文字を明示する必要があります。
# CSVデータの作成
echo "id,name,price" > items.csv
echo "1,Apple,150" >> items.csv
echo "2,Orange,100" >> items.csv
echo "3,Banana,120" >> items.csv
# カンマ区切りとして、3列目(価格)を数値でソート
sort -t ',' -k 3,3n items.csv
これを忘れると、行全体が一つの列として扱われてしまい、期待通りのソートが行われません。
パスワードファイル(/etc/passwd)のようなコロン区切りのファイルを解析する際にも非常に便利です。
重複行の排除(-uオプション)
データのリストから重複を排除して、ユニークな行だけを抽出したい場合には、-u(unique)オプションが最適です。
同様の処理はuniqコマンドでも可能ですが、uniqは「隣接する行」しか比較できないため、事前にソートしておく必要があります。
sort -uを使用すれば、並び替えと重複排除を一度に行えるため効率的です。
# 重複を含むデータのソートと一意化
cat <<EOF > tags.txt
linux
bash
linux
python
bash
EOF
sort -u tags.txt
bash
linux
python
大量のログからアクセス元のIPアドレス一覧を作成する場合などに多用されます。
ヒューマンレダブルな数値のソート(-hオプション)
モダンなシステム管理において非常に重宝するのが、-h(human-numeric-sort)オプションです。
これは、du -hやls -lhで表示される「2K」「5M」「1G」といった単位付きの数値を、その大きさに応じて正しくソートする機能です。
# サイズ混在データのソート
cat <<EOF > sizes.txt
1.2G
500M
3K
10M
EOF
sort -h sizes.txt
3K
10M
500M
1.2G
このオプションがない場合、単純な辞書順や数値順では単位を無視してしまうため、正しい順序になりません。
ストレージ容量の圧迫調査を行う際には、必ず覚えておきたいテクニックの一つです。
バージョン番号の適切なソート(-Vオプション)
ソフトウェアのバージョンやカーネルのバージョンを並び替える際には、-V(version-sort)オプションが威力を発揮します。
バージョン番号は「1.10」が「1.2」よりも新しい(大きい)と判断される必要がありますが、通常の数値ソートや辞書順ではこれが困難です。
# バージョン番号の比較
cat <<EOF > versions.txt
app-1.2.1
app-1.10.0
app-1.2.10
app-1.1.9
EOF
sort -V versions.txt
app-1.1.9
app-1.2.1
app-1.2.10
app-1.10.0
このように、自然なソフトウェアバージョンの順序で並び替えることができます。
ロケールとソート順の注意点
sortコマンドの動作は、システムの「ロケール(言語設定)」に強く依存します。
特に大文字・小文字の混在時や記号の扱いにおいて、期待した結果が得られないことがあります。
純粋な文字コード順(バイト単位)で厳密にソートしたい場合は、環境変数 LC_ALL=C を指定するのが定石です。
# ロケールを指定してソート(実行環境に左右されない結果を得る)
LC_ALL=C sort data.txt
この設定を使用すると、処理速度も向上するため、巨大なファイルを扱う際のパフォーマンスチューニングとしても有効です。
まとめ
Bashのsortコマンドは、単なる行の入れ替えツールに留まらない、多機能なデータ処理ツールです。
-nによる数値比較、-kによる列指定、そして-hや-Vといった特殊なソート方法をマスターすることで、日常のコマンドライン作業は格段に効率化されます。
特に複数のオプションを組み合わせることで、複雑な条件のデータ抽出もシェルスクリプトのみで完結させることが可能になります。
今回紹介したテクニックを活用し、ぜひ日々のログ解析やデータ集計に役立ててください。
まずは身近なテキストファイルやコマンドの出力に対して、様々なオプションを試してみることから始めてみましょう。
