sortコマンドで覚えておきたい使い方9個(+3個)

Linux/UNIXでよく使用される、出力される内容を並び替えするsortコマンド。
今回は、このsortコマンドで覚えておきたい使い方についてを紹介する。

1.基本的な使い方

基本的には、以下のようにコマンドを実行することでその出力内容を並び替える事が出来る。

[root@test-centos7 ~]# cat /work/test5.txt
5 eeeee
1 aaaaa
4 ddddd
2 bbbbb
6 fffff
3 ccccc
[root@test-centos7 ~]# cat /work/test5.txt | sort
1 aaaaa
2 bbbbb
3 ccccc
4 ddddd
5 eeeee
6 fffff

2.文字列を数字として並び替えを行う

通常、sortコマンドで並び替えを行う場合、文字列として並び替えされてしまう。
それを数字として並び替える場合、「-n」オプションを付与する。

[root@test-centos7 ~]# cat /work/test5.txt
5 eeeee
1 aaaaa
9 iiiii
4 ddddd
8 hhhhh
10 jjjjj
2 bbbbb
6 fffff
7 ggggg
3 ccccc
[root@test-centos7 ~]# cat /work/test5.txt | sort
1 aaaaa
10 jjjjj
2 bbbbb
3 ccccc
4 ddddd
5 eeeee
6 fffff
7 ggggg
8 hhhhh
9 iiiii
[root@test-centos7 ~]# cat /work/test5.txt | sort -n
1 aaaaa
2 bbbbb
3 ccccc
4 ddddd
5 eeeee
6 fffff
7 ggggg
8 hhhhh
9 iiiii
10 jjjjj

3.逆順で並び替えを行う

並び替えを逆順(降順)で行う場合は、「-r」オプションを付与する。

[root@test-centos7 ~]# cat /work/test5.txt
5 eeeee
1 aaaaa
9 iiiii
4 ddddd
8 hhhhh
10 jjjjj
2 bbbbb
6 fffff
7 ggggg
3 ccccc
[root@test-centos7 ~]# cat /work/test5.txt | sort -n
1 aaaaa
2 bbbbb
3 ccccc
4 ddddd
5 eeeee
6 fffff
7 ggggg
8 hhhhh
9 iiiii
10 jjjjj
[root@test-centos7 ~]# cat /work/test5.txt | sort -nr
10 jjjjj
9 iiiii
8 hhhhh
7 ggggg
6 fffff
5 eeeee
4 ddddd
3 ccccc
2 bbbbb
1 aaaaa

4.並び替えを行う列を指定する

並び替えを行う列を指定する場合は、「-k」オプションを用いてその列を指定する事も出来る。複数指定する場合は、優先順位ごとに「,」で区切る。
例えば、以下の例では3列目で並び替えを実施している。

[root@test-centos7 ~]# cat /work/test5.txt
5 eeeee 9
1 aaaaa 10
9 iiiii 1
4 ddddd 3
8 hhhhh 2
10 jjjjj 5
2 bbbbb 4
6 fffff 6
7 ggggg 8
3 ccccc 7
[root@test-centos7 ~]# cat /work/test5.txt | sort -n
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8
8 hhhhh 2
9 iiiii 1
10 jjjjj 5
[root@test-centos7 ~]# cat /work/test5.txt | sort -n -k3
9 iiiii 1
8 hhhhh 2
4 ddddd 3
2 bbbbb 4
10 jjjjj 5
6 fffff 6
3 ccccc 7
7 ggggg 8
5 eeeee 9
1 aaaaa 10

なお、通常であれば各列の区切りはスペースやTabとなっているが、特定の文字列(例えばカンマなど)で列が区切られている場合は、「-t」オプションで指定することが出来る。
以下の例では、「-t」で「,(カンマ)」区切りを指定している。

[root@test-centos7 ~]# cat /work/test5_1.txt
5,eeeee,9
1,aaaaa,10
9,iiiii,1
4,ddddd,3
8,hhhhh,2
10,jjjjj,5
2,bbbbb,4
6,fffff,6
7,ggggg,8
3,ccccc,7
[root@test-centos7 ~]# cat /work/test5_1.txt | sort -nk3 -t,
9,iiiii,1
8,hhhhh,2
4,ddddd,3
2,bbbbb,4
10,jjjjj,5
6,fffff,6
3,ccccc,7
7,ggggg,8
5,eeeee,9
1,aaaaa,10

5.大文字・小文字の区別をしない

sortコマンドでは、通常だとアルファベットの大文字、小文字を区別して並び替えを行う。
これを大文字、小文字の区別なく並び替えさせる場合は、「-f」オプションを付与する

[root@test-centos7 ~]# cat /work/test5_2.txt
aaaaaa
bbbbbb
DDDDDD
AAAAAA
cccccc
dddddd
eeeeee
CCCCCC
[root@test-centos7 ~]# cat /work/test5_2.txt | sort
AAAAAA
CCCCCC
DDDDDD
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
[root@test-centos7 ~]# cat /work/test5_2.txt | sort -f
AAAAAA
aaaaaa
bbbbbb
CCCCCC
cccccc
DDDDDD
dddddd
eeeeee

6.バイト数(KB、MB、GB etc...)を並び替えする

人間が読みやすい状態で出力されたバイト数を並び替えるには、「-h」オプションを利用する。

[root@test-centos7 ~]# du -h /etc | head
24K     /etc/pki/rpm-gpg
176K    /etc/pki/ca-trust/extracted/java
312K    /etc/pki/ca-trust/extracted/openssl
600K    /etc/pki/ca-trust/extracted/pem
1.1M    /etc/pki/ca-trust/extracted
0       /etc/pki/ca-trust/source/anchors
0       /etc/pki/ca-trust/source/blacklist
4.0K    /etc/pki/ca-trust/source
1.1M    /etc/pki/ca-trust
0       /etc/pki/java
[root@test-centos7 ~]# du -h /etc | sort -hr | head
22M     /etc
11M     /etc/selinux/targeted
11M     /etc/selinux
5.8M    /etc/udev
5.6M    /etc/selinux/targeted/modules/active
5.6M    /etc/selinux/targeted/modules
4.8M    /etc/selinux/targeted/modules/active/modules
3.7M    /etc/selinux/targeted/policy
1.8M    /etc/selinux/targeted/contexts
1.7M    /etc/selinux/targeted/contexts/files

※なお、findとlsを組み合わせた出力をsortしたところ、うまく出力されなかった。
awkでサイズを左端にするとうまく動作するようだが、理由は不明。

7.sort時に重複している行を圧縮する

sort時に重複している行を削除する場合は、「-u」オプションを使用する。

[root@test-centos7 ~]# cat /work/test5_3.txt | sort -n
1 aaaaa 10
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8
7 ggggg 8
8 hhhhh 2
9 iiiii 1
10 jjjjj 5
10 jjjjj 5
[root@test-centos7 ~]# cat /work/test5_3.txt | sort -un
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8
8 hhhhh 2
9 iiiii 1
10 jjjjj 5

8.sort済のファイルに結果をマージする

すでにsort済の各ファイルをマージする場合は、「-m」オプションで行う事が出来る。

[root@test-centos7 ~]# cat /work/test5_4.txt
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
5 eeeee 9
6 fffff 6
7 ggggg 8
8 hhhhh 2
9 iiiii 1
10 jjjjj 5
[root@test-centos7 ~]# cat /work/test5_5.txt
5 dadadad
9 aaaaaaaaa
11 dadadadadada
12 cccccccccccc
[root@test-centos7 ~]# sort -nm /work/test5_4.txt /work/test5_5.txt
1 aaaaa 10
2 bbbbb 4
3 ccccc 7
4 ddddd 3
5 dadadad
5 eeeee 9
6 fffff 6
7 ggggg 8
8 hhhhh 2
9 aaaaaaaaa
9 iiiii 1
10 jjjjj 5
11 dadadadadada
12 cccccccccccc

9.ファイルが順番どおりに並び替えられているか確認する

「-c」オプションを使用すると、そのファイルがソート済かどうかを確認することが出来る。

[root@test-centos7 ~]# cat /work/test5_3.txt
7 ggggg 8
5 eeeee 9
1 aaaaa 10
10 jjjjj 5
9 iiiii 1
4 ddddd 3
8 hhhhh 2
1 aaaaa 10
10 jjjjj 5
2 bbbbb 4
4 ddddd 3
6 fffff 6
7 ggggg 8
3 ccccc 7
[root@test-centos7 ~]# sort -c /work/test5_3.txt
sort: /work/test5_3.txt:2: 順序が不規則: 5 eeeee 9
[root@test-centos7 ~]# sort /work/test5_3.txt | sort -c

2016/05/27 追記

10.ナチュラルソートを行う

「-V」オプションを付与することで、ナチュラルソートを行うこともできる

sort -V
[centos@test-centos7 ~]$ cat /tmp/test1.txt
test1
test10
test4
test20
test3
test2
[centos@test-centos7 ~]$
[centos@test-centos7 ~]$ cat /tmp/test1.txt | sort
test1
test10
test2
test20
test3
test4
[centos@test-centos7 ~]$ cat /tmp/test1.txt | sort -V
test1
test2
test3
test4
test10
test20

2017/04/18 追記

11.ファイルをソートして上書きする

以下のように、-u及び-oオプションに対象のファイルを指定することで、対象のファイルをソートして上書きすることができる。

sort -u file -o file
blacknon@BS-PUB-DEVELOP:~$ cat stest.txt
11
09
12
02
14
05
08
06
03
07
01
13
15
04
10
blacknon@BS-PUB-DEVELOP:~$ sort -u stest.txt -o stest.txt
blacknon@BS-PUB-DEVELOP:~$ cat stest.txt
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15

2017/07/01 追記

12.+記号付きの数字をsortする

第29回シェル芸勉強会で知ったのだが、-gオプションを付与することで+nとか記述されている数字でもうまくsortしてくれるようになるようだ。

sort -g
blacknon@BS-PUB-UBUNTU-01:~$ echo 28 35 +60 1 74 97 -36 26 37 91 -77 54 47 81 -39 34 +2 98 66 10 | tr ' ' '\n' | sort -n
-77
-39
-36
<span style="color: #ff0000;">+2
+60</span>
1
10
26
28
34
35
37
47
54
66
74
81
91
97
98
blacknon@BS-PUB-UBUNTU-01:~$ echo 28 35 +60 1 74 97 -36 26 37 91 -77 54 47 81 -39 34 +2 98 66 10 | tr ' ' '\n' | sort -g
-77
-39
-36
1
+2
10
26
28
34
35
37
47
54
+60
66
74
81
91
97
98