UNIX/Linuxの部屋 sortコマンドの使い方


※空白区切りで AND 検索 (例:「ファイル 削除」)

コマンド sort 行単位でソート・並べ替えを行う

最終更新


UNIX/Linux の sort コマンドは、ファイル内容や文字列をソートするコマンドである。何番目のカラムに従ってソートするか、文字列としてソートするか数値としてソートするか、昇順・降順か、などを指定できる。


sort コマンドの基本的な使い方
ファイルの内容をソートする。
% sort sample.txt
コマンドの実行結果をソートする。
% command | sort
複数ファイルを対象とすることもできる。
% sort *.log

sort コマンドの出力は、デフォルトでは ASCII コード順に並べる (のだが、最近はいろいろめんどくさい。後述)。
% sort sample.txt
1
11
2
22
:
=
A
AB
_
a
ab
bc
逆順にするには -r オプションを使う。
% sort -r sample.txt
bc
(略)
1

ASCII コード順ではなく、数値として解釈してほしい場合は -n オプションを使う。典型的には、ファイルサイズ・回数をカウントする際に -n オプションを使うことが多い。

下記は、/var/log の下からファイルサイズ昇順でソートし、サイズの大きいもの 10件をリストアップする例である。
% ls -l /var/log/ | sort -k5,5 -n | tail -10
-rw------- 1 root root 1024256 Oct 22 03:47 log1
-rw------- 1 root root 1418032 Oct 29 03:24 log4
-rw------- 1 root root 1616547 Oct 8 03:08 log3
-rw------- 1 root root 1935428 Oct 8 03:08 log9
-rw------- 1 root root 3254279 Oct 21 10:09 log5
-rw------- 1 root utmp 5665152 Nov 1 03:11 log2
-rw------- 1 root root 62963872 Nov 1 08:31 log6
-rw------- 1 root root 107586181 Oct 29 03:29 log7

上記でも示したように、特定カラムをキーとしてソートする場合、-k オプションを使用する。
% sort -k3,3
と同じ値を指定すると、3 カラム目のみの比較を行う。
% sort -k3,3 -k1,1
というふうに、-k オプションを複数並べることがで、3カラム目が同じであれば 1カラム目で比較することもできる。

もし、
% sort -k3
とすると、3カラム目の先頭から行末までを 1カラムとして扱いソートする。-n オプションとの相性が悪いので、基本的には
% sort -k3,4
とすれば、3カラム目でソートし、3カラム目が同じ場合は 4カラム目でソートする。

sort + uniq コマンド
sort コマンドは uniq コマンドと共に使うことでさらに威力を発揮する。下記は、Web サーバのログから特定の1時間分のアクセスを抽出し、その IP アドレスの件数をカウントしたものである。awk コマンドで第一カラムの IP アドレスのみ出力し、sort コマンドでソートして同じ IP アドレスが連続した行になるようにした上で uniq -c とすると出現回数を出力してくれるので、sort -n で出現回数を数字としてソートしている。この例では、特定 IP アドレスのみ件数がダントツで多いため、この IP アドレスから何らかのアタックがあったのでは、などが疑われる。
% grep '29/Oct/2017:03' /var/log/httpd/access_log | awk '{print $1}' | sort | uniq -c | sort -n | tail -5
454 111.111.111.111
467 111.111.111.112
611 111.111.111.113
621 111.111.111.114
27212 11.22.33.44

sort コマンドのオプション
-c すでにソートされているかを調べる
-f 大文字と小文字の区別をしない
-m 複数のファイルをソートするとき、すでにそれぞれソートされている場合に指定。
-mをつけなくてもソート結果は同じだが、高速になる
-r 逆順にソートする
-R または --random-sort
ランダムにソートする。ただし sort -R はハッシュでソートするため、同じ行があると固まって出力されてしまう。重複値が隣り合うと困る場合は、shuf コマンドを使うとよい。
% for i in 1 2 2 2 3 3 3 3 3 4 5 6 7 8 ; do echo $i ; done | sort -R
→ sort -R だと 2 や 3 が必ず隣り合って出力される
% for i in 1 2 2 2 3 3 3 3 3 4 5 6 7 8 ; do echo $i ; done | shuf
→ shuf コマンドだと大丈夫
-n 文字列ではなく、数字とみなしてソート
% sort sample (デフォルトでは文字列としてソート)
1
12
2
20
% sort -n sample (数字としてソート)
1
2
12
20
-u 同一内容の行は1度しか表示しない。
% cat sample | sort
abc
def
def
ghi
% cat sample | sort -u
abc
def (同じ行は一度しか表示しない)
ghi
-h K・M・G などの接尾辞を解釈した上でソートする。
一部 UNIX の ls・du・df コマンドなどは -h オプション (--human-readable オプション) が指定されるとキロ・メガ・ギガなどと表す接尾辞 K・M・G などと表示する。
sort コマンドにも -h オプションを指定可能で、10G は 10M の 1024倍であるなどと計算しながら並び替えをおこなってくれる。
% du -h -d 1 / | sort -hr
10G /usr
10G /
311M /var
65M /boot
6.3M /lib
2.1M /etc
908K /bin
3.0K /dev
512B /mnt
+数字 指定の数のフィールドに従ってソートする。
% ls -l
-rw-rw-r-- 1 user group 869083 Jan 23 22:09 RMAIL
-rw-rw-r-- 1 user group 1721780 Jan 24 05:20 ba2.tgz
drwxr-xr-x 2 user group 1024 Jan 23 21:01 bin
-rw-rw-r-- 1 user group 4540 Jan 26 17:34 english.dvi
⇒ ls のデフォルト動作は、ファイル名によってソートされる
% ls -l | sort +4
drwxr-xr-x 2 user group 1024 Jan 23 21:01 bin
-rw-rw-r-- 1 user group 4540 Jan 26 17:34 english.dvi
-rw-rw-r-- 1 user group 869083 Jan 23 22:09 RMAIL
-rw-rw-r-- 1 user group 1721780 Jan 24 05:20 ba2.tgz
⇒ 4番目のフィールド=ファイルサイズのフィールドに従ってソート
% ls -l | sort +6
-rw-rw-r-- 1 user group 1721780 Jan 24 05:20 ba2.tgz
-rw-rw-r-- 1 user group 4540 Jan 26 17:34 english.dvi
drwxr-xr-x 2 user group 1024 Jan 23 21:01 bin
-rw-rw-r-- 1 user group 869083 Jan 23 22:09 RMAIL
⇒ 6番目のフィールド=作成時刻のフィールドに従ってソート
0番目のフィールドは行頭を表すので、sort +0 と sort は同じである。
>> Solaris10オンラインマニュアル(man) Solaris10 sort(1)
>> FreeBSDオンラインマニュアル(man) FreeBSD sort(1)
>> Linuxオンラインマニュアル(man) Linux sort(1)


頑張って書いたおすすめコンテンツ!
クラウドサービス徹底比較・徹底解説