sortコマンドでテキストを並び替える方法|数値ソートやフィールド指定も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > sortコマンドでテキストを並び替える方法|数値ソートやフィールド指定も
「sortコマンドで並び替えたら、数値の順番がおかしい」
「CSVの特定の列でソートしたいけど、やり方がわからない」

LinuxのsortコマンドはCoreutils(GNU sort)に含まれており、RHEL 9 / Ubuntu 24.04 LTS標準搭載のテキスト処理ユーティリティです。ログ解析、設定ファイルの確認、データの集計など、サーバー管理のあらゆる場面で使います。

この記事では、sortコマンドの基本から、数値ソート・フィールド指定・重複削除まで、実務で必要になるオプションをすべて解説します。「100が2より前に来る」という初心者がハマりやすい落とし穴と、その対処法もしっかり押さえましょう。

この記事のポイント

・sort はテキストを行単位で並び替える基本コマンド
・数値ソートは -n、降順は -r、列指定は -k と -t で行う
・-V でバージョン番号順、-u で重複排除も1コマンドで完結する
・uniq と組み合わせれば、ログのIP集計もワンライナーで処理できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

sortコマンドとは?テキストを行単位で並び替える

sortコマンドは、テキストファイルの内容や標準入力を行単位で並び替えて出力するコマンドです。Coreutils(GNU sort)に含まれており、RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTSいずれも標準でインストール済みで、追加インストールは不要です。

デフォルトでは、各行の先頭文字からアルファベット順(辞書順)で昇順に並び替えます。元のファイルの内容は変更されず、結果は標準出力(画面)に表示されます。

主な用途は以下のとおりです。

ログファイルの整理:アクセスログやエラーログを特定の項目で並び替える
設定ファイルの確認:/etc/passwdをUID順にソートしてユーザーを一覧する
データの集計:sort | uniq -c で重複行をカウントする
ディスク使用量の調査:du の出力をサイズ順に並び替えて、大きなディレクトリを特定する

sortは単体でも便利ですが、パイプ(|)で他のコマンドと組み合わせることで真価を発揮します。

sortコマンドの基本的な使い方

1. ファイルをアルファベット順に並び替える

もっとも基本的な使い方です。ファイル名を引数に指定するだけで、各行がアルファベット順(昇順)に並びます。

# ファイルの内容を昇順で表示 sort ファイル名

たとえば、servers.txt に以下のサーバー名が入っているとします。

web03.example.com db01.example.com app02.example.com web01.example.com

実行結果はこうなります。

$ sort servers.txt app02.example.com db01.example.com web01.example.com web03.example.com

元のファイルは変更されません。並び替えた結果をファイルに保存したい場合は、リダイレクトを使います。

# 結果を別ファイルに保存 sort servers.txt > sorted.txt

2. 降順に並び替える(-r オプション)

-r(reverse)オプションを付けると、並び順が逆になります。-n と組み合わせると数値の大きい順になります。

# 降順(Z->A)で表示 sort -r ファイル名 # 数値の大きい順(降順) sort -rn ファイル名

3. 大文字・小文字を区別しない(-f オプション)

デフォルトでは大文字と小文字を区別してソートしますが、-f(fold)オプションで区別をなくせます。

# 大文字・小文字を区別せずにソート $ sort -f names.txt Alice bob Carol dave

数値でソートする(-n オプション)~初心者がハマる落とし穴~

sortコマンドで最もよくある間違いが、数値を含むデータのソートで -n を付け忘れることです。

たとえば、以下のようなファイルがあるとします。

100 2 30 5

-n なしでソートすると、こうなります。

$ sort numbers.txt 100 2 30 5

「100」が「2」より前に来ています。これは、sortがデフォルトでは文字列として辞書順に比較するからです。文字列比較では先頭の「1」が「2」より小さいと判定されるため、「100」が先に来ます。

数値として正しくソートするには、-n(numeric)オプションを付けてください。

# 数値としてソート(昇順) $ sort -n numbers.txt 2 5 30 100

数値の大きい順に並べたい場合は、-n と -r を組み合わせます。

# 数値の降順でソート sort -nr numbers.txt

特定のフィールドでソートする(-k と -t オプション)

実務では、CSVや区切り文字付きのデータを特定の列で並び替えたい場面が多くあります。sortコマンドでは、-t で区切り文字を指定し、-k でソート対象のフィールド番号を指定します。

1. 基本的なフィールド指定

# -t で区切り文字を指定、-k でフィールド番号を指定 sort -t '区切り文字' -k フィールド番号 ファイル名

フィールド番号は1から始まります。スペース区切りのファイルで2列目(アクセス数)を基準に昇順ソートする例です。

# user_access.txt(ユーザー名 アクセス数) alice 50 carol 120 bob 8 dave 75 # 2列目を数値として昇順ソート $ sort -k2 -n user_access.txt bob 8 alice 50 dave 75 carol 120

2. /etc/passwd をUID順にソートする

/etc/passwd はコロン(:)で区切られており、3番目のフィールドがUID(ユーザーID)です。UID順に並べるには、数値ソート(-n)も組み合わせます。

# /etc/passwd をUID(3番目のフィールド)の数値順にソート sort -t: -k3 -n /etc/passwd

この例は、-t(区切り文字)、-k(フィールド指定)、-n(数値ソート)の3つを同時に使う典型的なパターンです。実務でもよく使うので覚えておきましょう。

3. CSVをカンマ区切りで並び替える

カンマ区切りのCSVで特定の列を基準にソートする例です。

# data.csv host01,web,300 host03,db,50 host02,app,150 # 3列目(数値)で昇順ソート $ sort -t',' -k3 -n data.csv host03,db,50 host02,app,150 host01,web,300

4. フィールド範囲を指定する

-k オプションでは、開始フィールドと終了フィールドを指定できます。

# 2番目のフィールドのみを基準にソート sort -t, -k2,2 data.csv # 2番目のフィールドを数値としてソート sort -t, -k2,2n data.csv

-k2 だけだと「2番目のフィールドから行末まで」がソートキーになります。特定のフィールドだけでソートしたい場合は -k2,2 のように終了フィールドも指定してください。

重複行を削除する(-u オプションとuniqコマンド)

1. -u オプションで重複を除去する

-u(unique)オプションを付けると、ソート後に同じ内容の行を1つにまとめて出力します。

# iplist.txt(重複あり) 192.168.1.10 192.168.1.5 192.168.1.10 192.168.1.20 # 重複行を除去して表示 $ sort -u iplist.txt 192.168.1.10 192.168.1.20 192.168.1.5

sort -u は「sort | uniq」のパイプを1コマンドで完結できるため、スクリプト内での利用に便利です。

2. sort | uniq の組み合わせ

重複行のカウントが必要な場合は、sort と uniq -c を組み合わせます。uniqコマンドは連続する同じ行を処理するため、事前にsortで並び替えておく必要があります。

# 重複行をカウントして多い順に表示 sort access.log | uniq -c | sort -nr

このパターンは、アクセスログのIPアドレス集計やエラーの発生頻度調査など、ログ解析の定番です。

3. 安定ソート(-s オプション)

同じキー値を持つ行について、元のファイルの並び順を維持したい場合は -s(stable)オプションを使います。

# 2列目で数値ソート、同じ値の行は元の順序を維持 sort -k2 -n -s records.txt

たとえば、同じアクセス数のユーザーが複数いる場合に、元のファイルの登録順を保ちたいときに役立ちます。

実務で役立つsortの応用テクニック

1. ログのIPアドレス出現数を集計する

Apacheアクセスログからアクセス数の多いIPを上位10件抽出する定番パターンです。

# アクセスログからIP出現数トップ10を抽出 $ awk '{print $1}' /var/log/httpd/access_log | sort | uniq -c | sort -rn | head -10

# 実行例(IPは一部マスク) 512 203.0.113.xx 278 198.51.100.xx 195 192.0.2.xx 142 10.0.1.xx 98 172.16.0.xx

パイプラインの流れ:
awk '{print $1}' でIPアドレス列を抽出
sort で同一IPをまとめる(uniq -c の前提)
uniq -c で出現回数をカウント
sort -rn で多い順に並べる
head -10 で上位10件に絞る

2. ディスク使用量をサイズ順に表示する

du コマンドと組み合わせて、ディレクトリのサイズを大きい順に表示できます。-h(human-readable)オプションを使えば、K・M・Gの単位付きでも正しくソートされます。

# カレントディレクトリ配下のサイズを大きい順に表示 du -sh * | sort -rh

-h オプションはGNU sort(Linuxの標準)で使えます。K(キロバイト)、M(メガバイト)、G(ギガバイト)の単位を認識して、正しい大きさの順に並べてくれます。

3. バージョン番号順に並べる(-V オプション)

ファイル名にバージョン番号が含まれている場合、-n では「1.9」が「1.10」より後に来てしまいます。-V(version-sort)オプションを使うと自然順(バージョン順)で並びます。

# バージョン番号を含むファイルを自然順で並べる $ ls backup-*.tar.gz | sort -V backup-1.9.tar.gz backup-1.10.tar.gz backup-2.0.tar.gz backup-2.1.tar.gz

-n だと「backup-1.10」が「backup-1.9」の前に来てしまいます。バックアップファイルやパッケージのバージョン管理をする際は -V を使いましょう。

4. 同じファイルにソート結果を上書きする(-o オプション)

通常、リダイレクトで同じファイルに書き込もうとすると、ファイルの中身が空になってしまいます。

# これはNG - ファイルが空になる sort file.txt > file.txt

-o オプションを使えば、安全に同じファイルへ上書きできます。

# 安全に同じファイルへソート結果を上書き sort -o file.txt file.txt

sortコマンドは内部で一時ファイルを使って処理するため、入力と出力が同じファイルでも問題ありません。

5. 先頭の空白を無視してソートする(-b オプション)

フィールドの先頭に空白(スペースやタブ)が含まれていると、意図どおりにソートされないことがあります。-b(ignore-leading-blanks)オプションで先頭の空白を無視できます。

# 先頭の空白を無視してソート sort -b ファイル名

「ソート結果がおかしい」時のトラブルシュート

1. ロケール(locale)の影響で並び順が変わる

Linuxのsortコマンドは、環境変数のロケール設定によって並び順が変わります。日本語環境(ja_JP.UTF-8)では、英語環境とは異なる照合順序(しょうごうじゅんじょ)が使われるため、期待どおりの結果にならないことがあります。

確実にバイト値の順序でソートしたい場合は、LC_ALL=C を指定してください。

# ロケールをCに設定して、バイト値順でソート LC_ALL=C sort ファイル名

特にスクリプト内でsortを使う場合は、環境に依存しないように LC_ALL=C を付けておくのが安全です。

2. 数値のソートで順番がおかしい

先述のとおり、-n オプションを付け忘れると文字列比較になります。数値データを扱う場合は必ず -n を付けてください。

また、数値の前にスペースが入っている場合は、-b オプションも併用しましょう。

# 先頭スペースを無視して数値ソート sort -bn ファイル名

数値列に文字が混じっていて正しくソートされない場合は、事前に grep で数値行だけを絞り込むと確実です。

# 数値行のみ抽出してからソート grep -E '^[0-9]+$' data.txt | sort -n

3. フィールド指定のソートが効かない

-k オプションのよくある失敗パターンです。

区切り文字の指定漏れ:-t を省略すると、空白(スペース・タブ)が区切り文字になる。CSVなどでは -t, の指定が必須
フィールド範囲の未指定:-k2 だけだと2番目のフィールドから行末までがキーになる。特定列だけなら -k2,2 と指定する
数値フィールドなのに -n を忘れる:-k3 -n または -k3,3n のように数値ソートを指定する

4. 大きなファイルのソートで「書き込みに失敗しました」と表示される

大きなファイルのソート中にディスクの空き容量が不足すると発生します。sortは内部的に /tmp に一時ファイルを作成するため、/tmp の空き容量を確認してください。

# /tmp の空き容量確認 $ df -h /tmp Filesystem Size Used Avail Use% Mounted on tmpfs 7.8G 1.2G 6.6G 16% /tmp # 一時ディレクトリを変更する場合 sort -T /var/tmp bigfile.txt

本記事のまとめ

sortコマンドの基本から応用までを解説しました。最も重要なポイントは、数値のソートには必ず -n を付けることです。以下の早見表で、必要なオプションをすぐに確認できます。
やりたいこと コマンド
ファイルを昇順にソート sort ファイル名
降順にソート sort -r ファイル名
数値として昇順にソート sort -n ファイル名
数値の降順にソート sort -nr ファイル名
大文字・小文字を区別しないソート sort -f ファイル名
2列目を数値として昇順ソート sort -k2 -n ファイル名
区切り文字と列を指定してソート sort -t: -k3 -n /etc/passwd
重複行を除去してソート sort -u ファイル名
重複行をカウントして多い順に表示 sort ファイル名 | uniq -c | sort -nr
同じ値の行の元順序を維持(安定ソート) sort -k2 -n -s ファイル名
バージョン番号順に並べる sort -V ファイル名
ディスク使用量を大きい順に表示 du -sh * | sort -rh
同じファイルにソート結果を上書き sort -o file.txt file.txt
ロケールに依存しないソート LC_ALL=C sort ファイル名
IP出現数トップ10を抽出 awk '{print $1}' access_log | sort | uniq -c | sort -rn | head -10

ログ解析やデータ集計をコマンド一発でこなしたい方へ

sort と uniq の組み合わせは、現場の即戦力テクニックです。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。