每天一個linux命令(1)sort

1、工作原理

sort 是將文件的每一行作為一個單位,相互比較,比較原則是從首字符向后,依次按照ASCII碼值進(jìn)行比較,默認(rèn)將他們按照升序輸出

sort ./log.test
192.168.1.100
192.168.1.100
192.168.1.100
192.168.1.100
192.168.2.100
192.168.2.100
192.168.3.100
192.168.3.100

2、sort -r

降序

sort -r ./log.test
192.168.3.100
192.168.3.100
192.168.2.100
192.168.2.100
192.168.1.100
192.168.1.100
192.168.1.100
192.168.1.100

3、sort -u

在輸出中去重

cat ./log.test
192.168.1.100
192.168.2.100
192.168.1.100
192.168.3.100
192.168.1.100
192.168.2.100
192.168.1.100
192.168.3.100

sort -u ./log.test
192.168.1.100
192.168.2.100
192.168.3.100

4、sort -o

將排序結(jié)果輸出到原文件
sort的默認(rèn)輸出是輸出到標(biāo)準(zhǔn)輸出,如果想把結(jié)果輸出到文件,需要 sort file > newfile,但是如果想把結(jié)果輸出到原文件這樣就不行了,這時就需要 使用sort -o

cat ./log.test
192.168.1.100
192.168.2.100
192.168.1.100
192.168.3.100
192.168.1.100
192.168.2.100
192.168.1.100
192.168.3.100

sort -r ./log.test -o ./log.test

cat ./log.test
192.168.3.100
192.168.3.100
192.168.2.100
192.168.2.100
192.168.1.100
192.168.1.100
192.168.1.100
192.168.1.100

5、sort -n

以數(shù)值來排序
sort 默認(rèn)是按照字符串排序的,這樣就會出現(xiàn)10比3小的情況,sort -n 就可以告訴sort 以整數(shù)排序

sort ./num.log
1
10
3
9

sort ./num.log -n
1
3
9
10

6、sort的 -k 和 -t

-t 后面跟 分隔符
-k 后面跟數(shù)字,表示用第幾列排序
如 sort -t : -k 2 表示把每行 以:號分割,按照第二列排序

cat ./test2.log
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4

sort -t : -k 2 -r -n ./test2.log
pear:90:2.3

banana:30:5.5
orange:20:3.4
apple:10:2.5

7、玩轉(zhuǎn) sort -k

1)先看一下文件內(nèi)容

cat ./test3.log
google 110 5000
baidu 100 5000
guge 50 3000
sohu 100 4500

2) 按第一個域進(jìn)行排序

sort -t ' ' -k 1 ./test3.log
baidu 100 5000
google 110 5000
guge 50 3000
sohu 100 4500

3) 按第二個域進(jìn)行排序

sort -n -t ' ' -k 2 ./test3.log
guge 50 3000
baidu 100 5000
sohu 100 4500
google 110 5000

我們可以看到,當(dāng)baidu 和soho都是100的時候,baidu排在前面,當(dāng)當(dāng)前域按照默認(rèn)規(guī)矩,是從第一個域開始進(jìn)行升序排序,因此baidu排在了sohu前面。

4) 按第二個域進(jìn)行排序,如果第二個域相同,再按照第三個域排序

sort -n -t ' ' -k 2 -k 3 ./test3.log
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

sort 支持 -k 2 -k3這種模式,如果你需要,你可以繼續(xù)這么寫下去

5) 按照 第三個域 降序,然后如果第三個域相同,按照第二個域升序

sort -n -t ' ' -k 3r -k 2 ./test3.log
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

你仔細(xì)看看,在-k 3后面偷偷加上了一個小寫字母r,r和-r的作用是一樣,你也可以把前面的-n去掉 在r后面加上n,如下

sort -t ' ' -k 3nr -k 2 ./test3.log
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

其實-k 選項 功能很強(qiáng)大,語法[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
從逗號前后 分為兩大部分,即-k 2,2,是嚴(yán)格使用第一個域排序,如果只設(shè)置-k 2 其實是按照從第一個域到行尾。逗號分開的每部分又有一個點(diǎn)表示子域,即-k 1.2表示 按照第一個域的第二個字符排序,Modifiers就是我們用到的n和r 如 -k 1.2nr 具體我們看下面的例子。

6)從第一個域的第二個字母開始進(jìn)行排序

sort -t ' ' -k 1.2 ./test3.log
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000

我們使用了-k 1.2,這就表示對第一個域的第二個字符開始到本域的最后一個字符為止的字符串進(jìn)行排序。你會發(fā)現(xiàn)baidu因為第二個字母是a而名列榜首。sohu和 google第二個字符都是o,但sohu的h在google的o前面,所以兩者分別排在第二和第三。這和之前說到的按照默認(rèn)的排序規(guī)則 是不同的,當(dāng)?shù)谝粋€域的第二個字符相同時,他不會去按照第一個字符排序,而是按照后面的字符排序,這是因為-k 1.2是對第一個域的第二個字符開始到本域的最后一個字符為止的字符串進(jìn)行排序。而之前的夸域其實是一種假象。

7)只針對第一個域的第二個字母進(jìn)行排序,如果相同的按照員工工資進(jìn)行降序排序

sort -t ' ' -k 1.2,1.2 -k 3,3nr ./test3.log
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

8) -k 和 -u

sort -t ' ' -k 2n -u ./test3.log
guge 50 3000
baidu 100 5000
google 110 5000

-u只識別用-k設(shè)定的域,發(fā)現(xiàn)相同,就將后續(xù)相同的行都刪除

sort -n -k 2 -k 3 -u facebook.txt
guge 50 3000
sohu 100 4500
baidu 100 5000
google 110 5000

但是這時候,卻一行也沒有刪除。原來-u是會權(quán)衡所有-k選項,將都相同的才會刪除,只要其中有一級不同都不會輕易刪除的

9) 在modifier部分還可以用到哪些選項?

可以用到b、d、f、i、n 或 r。

其中n和r你肯定已經(jīng)很熟悉了。

b表示忽略本域的簽到空白符號。

d表示對本域按照字典順序排序(即,只考慮空白和字母)。

f表示對本域忽略大小寫進(jìn)行排序。

i表示忽略“不可打印字符”,只針對可打印字符進(jìn)行排序。(有些ASCII就是不可打印字符,比如\a是報警,\b是退格,\n是換行,\r是回車等等)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容