sort命令常用于對統(tǒng)計日志中不同服務錯誤的數(shù)量進行排序,現(xiàn)在我們就一起花5分鐘來學習sort命令!
sort的工作原理
sort將文件的每一行作為一個單位,相互比較,默認比較規(guī)則是從首字符向后,依次按ASCII碼值進行比較,最后將他們按升序輸出。
舉個例子:
[root@vm3 ~]# cat test.txt
zhangyishan 24 5678
yangzi 25 3400
wangyuan 20 2388
yangzi 25 3400
yangyang 25 2388
[root@vm3 ~]# sort test.txt
wangyuan 20 2388
yangyang 25 2388
yangzi 25 3400
yangzi 25 3400
zhangyishan 24 5678
2.sort的-u選項
-u的作用就是在輸出行中去重復
[root@vm3 ~]# sort -u test.txt
wangyuan 20 2388
yangyang 25 2388
yangzi 25 3400
zhangyishan 24 5678
3.sort 的-r選項
sort 的-r選項,是按照倒序排列
zhangyishan 24 5678
yangzi 25 3400
yangzi 25 3400
yangyang 25 2388
wangyuan 20 2388
4.sort的-o選項
正常將sort的執(zhí)行結(jié)果重定向到源文件會使源文件變?yōu)榭?/p>
[root@vm3 ~]# sort test.txt >test.txt
[root@vm3 ~]# cat test.txt
但是加上-o就可以將排序后的結(jié)果重定向到源文件
[root@vm3 ~]# sort test.txt -o test.txt
[root@vm3 ~]# cat test.txt
wangyuan 20 2388
yangyang 25 2388
yangzi 25 3400
yangzi 25 3400
zhangyishan 24 5678
5.sort的-n選項
-n選項是按照數(shù)值排序
[root@vm3 ~]# sort number.txt
1
12
14
2
2
3
5
7
[root@vm3 ~]# sort -n number.txt
1
2
2
3
5
7
12
14
6.sort的-t選項和-k選項
zhangyishan 24 5678像上面的一行文本以空格分割成三列,分別表示姓名 年齡 工資,如果我們想按第二列的年齡排序怎么辦呢,這時候就要用到-t和-k參數(shù)了
-t指定間隔符
-k用來指定列數(shù)
[root@vm3 ~]# sort -t ' ' -k 2 test.txt
wangyuan 20 2388
zhangyishan 24 5678
yangyang 25 2388
yangzi 25 3400
yangzi 25 3400
7. 其他的sort常用選項
-f會將小寫字母都轉(zhuǎn)換為大寫字母來進行比較,亦即忽略大小寫
-c會檢查文件是否已排好序,如果亂序,則輸出第一個亂序的行的相關(guān)信息,最后返回1
-C會檢查文件是否已排好序,如果亂序,不輸出內(nèi)容,僅返回1
-M會以月份來排序,比如JAN小于FEB等等
-b會忽略每一行前面的所有空白部分,從第一個可見字符開始比較。
有時候?qū)W習腳本,你會發(fā)現(xiàn)sort命令后面跟了一堆類似-k1,2,或者-k1.2 -k3.4的東東,有些匪夷所思。今天,我們就來搞定它—-k選項!
8.-k 的選項
-k 選項的語法如下:
[FStart[.CStart]][Modifier][,[FEnd[.CEnd]][Modifier]]
這個語法格式包含兩大部分,以逗號(,)分割為Start和End兩部分
如果不設置End部分,那么就認為End被設定為行尾!
Start部分由三部分組成:
FStart指定以哪個部分排序,1就是以第一部分排序
CStart指定從指定部分的第幾個字符開始排序
Modifier指定排序方式可以使用r、n等選項
9.演示-k的使用
如我們想從名字的第二個字符開始排序
[root@vm3 ~]# sort -t ' ' -k 1.2 test.txt
yangyang 25 2388
wangyuan 20 2388
yangzi 25 3400
yangzi 25 3400
zhangyishan 24 5678
只根據(jù)名字的第二個字母排序,第二個字母一樣,以年齡倒序排列
[root@vm3 ~]# sort -t ' ' -k 1.2,1.2 -k 2rn test.txt
yangyang 25 2388
yangzi 25 3400
yangzi 25 3400
wangyuan 20 2388
zhangyishan 24 5678
10.在modifier部分的選項
可以用到b、d、f、i、n 或 r。
其中n和r你肯定已經(jīng)很熟悉了。
b表示忽略本域的簽到空白符號。
d表示對本域按照字典順序排序(即,只考慮空白和字母)。
f表示對本域忽略大小寫進行排序。
i表示忽略“不可打印字符”,只針對可打印字符進行排序。(有些ASCII就是不可打印字符,比如\a是報警,\b是退格,\n是換行,\r是回車等等)