sortコマンドで覚えておきたい使い方9個
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