sort 是將文件的每一行作為一個(gè)單位,相互比較,比較原則是從首字符向后,依次按照ASCII碼值進(jìn)行比較,默認(rèn)將他們按照升序輸出
創(chuàng)新互聯(lián)建站是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的做網(wǎng)站、成都做網(wǎng)站,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十載品質(zhì),值得信賴!
降序
在輸出中去重
將排序結(jié)果輸出到原文件
sort的默認(rèn)輸出是輸出到標(biāo)準(zhǔn)輸出,如果想把結(jié)果輸出到文件,需要 sort file newfile,但是如果想把結(jié)果輸出到原文件這樣就不行了,這時(shí)就需要 使用sort -o
以數(shù)值來排序
sort 默認(rèn)是按照字符串排序的,這樣就會(huì)出現(xiàn)10比3小的情況,sort -n 就可以告訴sort 以整數(shù)排序
-t 后面跟 分隔符
-k 后面跟數(shù)字,表示用第幾列排序
如 sort -t : -k 2 表示把每行 以:號(hào)分割,按照第二列排序
banana:30:5.5
orange:20:3.4
apple:10:2.5
我們可以看到,當(dāng)baidu 和soho都是100的時(shí)候,baidu排在前面,當(dāng)當(dāng)前域按照默認(rèn)規(guī)矩,是從第一個(gè)域開始進(jìn)行升序排序,因此baidu排在了sohu前面。
sort 支持 -k 2 -k3這種模式,如果你需要,你可以繼續(xù)這么寫下去
你仔細(xì)看看,在-k 3后面偷偷加上了一個(gè)小寫字母r,r和-r的作用是一樣,你也可以把前面的-n去掉 在r后面加上n,如下
其實(shí)-k 選項(xiàng) 功能很強(qiáng)大,語法[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
從逗號(hào)前后 分為兩大部分,即-k 2,2,是嚴(yán)格使用第一個(gè)域排序,如果只設(shè)置-k 2 其實(shí)是按照從第一個(gè)域到行尾。逗號(hào)分開的每部分又有一個(gè)點(diǎn)表示子域,即-k 1.2表示 按照第一個(gè)域的第二個(gè)字符排序,Modifiers就是我們用到的n和r 如 -k 1.2nr 具體我們看下面的例子。
我們使用了-k 1.2,這就表示對(duì)第一個(gè)域的第二個(gè)字符開始到本域的最后一個(gè)字符為止的字符串進(jìn)行排序。你會(huì)發(fā)現(xiàn)baidu因?yàn)榈诙€(gè)字母是a而名列榜首。sohu和 google第二個(gè)字符都是o,但sohu的h在google的o前面,所以兩者分別排在第二和第三。這和之前說到的按照默認(rèn)的排序規(guī)則 是不同的,當(dāng)?shù)谝粋€(gè)域的第二個(gè)字符相同時(shí),他不會(huì)去按照第一個(gè)字符排序,而是按照后面的字符排序,這是因?yàn)?k 1.2是對(duì)第一個(gè)域的第二個(gè)字符開始到本域的最后一個(gè)字符為止的字符串進(jìn)行排序。而之前的夸域其實(shí)是一種假象。
-u只識(shí)別用-k設(shè)定的域,發(fā)現(xiàn)相同,就將后續(xù)相同的行都刪除
但是這時(shí)候,卻一行也沒有刪除。原來-u是會(huì)權(quán)衡所有-k選項(xiàng),將都相同的才會(huì)刪除,只要其中有一級(jí)不同都不會(huì)輕易刪除的
可以用到b、d、f、i、n 或 r。
其中n和r你肯定已經(jīng)很熟悉了。
b表示忽略本域的簽到空白符號(hào)。
d表示對(duì)本域按照字典順序排序(即,只考慮空白和字母)。
f表示對(duì)本域忽略大小寫進(jìn)行排序。
i表示忽略“不可打印字符”,只針對(duì)可打印字符進(jìn)行排序。(有些ASCII就是不可打印字符,比如\a是報(bào)警,\b是退格,\n是換行,\r是回車等等)
在linux系統(tǒng)使用過程中,提供了sort排序命令,支持常用的排序功能。
sort命令支持很多參數(shù),常用參數(shù)如下:
默認(rèn)情況下,sort命令,以字母序進(jìn)行文本排序。如下:
如果想對(duì)數(shù)字進(jìn)行排序,可以使用-n參數(shù)
sort排序的時(shí)候,可以按字段分割的數(shù)據(jù)進(jìn)行排序。-t參數(shù)表示行的分割字符,-k表示第幾列。當(dāng)然,可以進(jìn)行降序排序,-r參數(shù)可以實(shí)現(xiàn)。
下面是對(duì)passwd文件,以冒號(hào)(:)進(jìn)行分割,然后對(duì)第三列以數(shù)字方式進(jìn)行降序排序。
在du的時(shí)候,加上-h可以使用易讀性數(shù)字,比如2k,1g,3M這種。sort也支持-h參數(shù)。
比如,du一個(gè)文件夾下的目錄大小后,想以文件大小進(jìn)行排序。由于du -h的結(jié)果是3k,2M,1G這種,不能簡(jiǎn)單的按數(shù)字排序。所以,可以使用-h參數(shù)。具體如下:
查看系統(tǒng)進(jìn)程中,內(nèi)存占用最多的前5個(gè)進(jìn)程信息
如果文件內(nèi)容有很多重復(fù)的,需要進(jìn)行去重。sort也是支持的,可以通過-u參數(shù)使用
在shell中,一般將控制臺(tái)內(nèi)容寫入文件,可以使用重定向,但如果想把sort的排序內(nèi)容寫回文件,則不能使用重定向。則需要-o參數(shù)。具體如下:
無論是工作中使用還是應(yīng)付各種面試,linux sort 都是必須要掌握的 linux 基本命令之一。尤其是 linux sort -k 命令,經(jīng)常會(huì)被搞暈,索性好好研究一下 sort 命令
語法:
選項(xiàng):
參數(shù)就不一一介紹了,直接上例子,首先先看下原始的排序數(shù)據(jù)
cat sort.log
1、打印從哪列開始是亂序
sort -c sort.log; echo $?
sort -C sort.log; echo $?
其中,返回結(jié)果 1,表示文件不是已經(jīng)排序好的文件
2、默認(rèn)排序( 整行進(jìn)行ASCII字符升序)
sort sort.log
3、高能來了,讓人迷糊的 k 語法,首先看下 k 的語法格式
這個(gè)語法格式可以被其中的逗號(hào)(”,”)分為兩大部分,Start部分和End部分
Start和End部分都由三部分組成,其中的Modifier部分就是類似n和r的選項(xiàng)部分,可省略
FStart、Fend,表示使用的域,而CStart則表示在FStart域中從第幾個(gè)字符開始算"排序首字符",同理,CEnd表示結(jié)尾的第幾個(gè)字符是排序末尾字符,.CStart、.CEnd是可以省略的,分別表示從本域的開頭部分開始、到本域的域尾結(jié)束,CEnd設(shè)定為0,也是表示結(jié)尾到域尾??谡f無憑,上幾個(gè)例子吧
3.1 對(duì)第三列進(jìn)行排序,如果不加n,按照 ASCII字符排序
sort -t $'\t' -k 3 sort.log
3.2 加n后,按照數(shù)值排序
sort -t $'\t' -k 3n sort.log
3.3 不指定 FEnd 時(shí),多個(gè) -k 從前往后排序可以,從后往前不行
從后往前,多個(gè) -k,數(shù)據(jù)符合預(yù)期
sort -t $'\t' -k 3n -k 1 sort.log
從后往前,多個(gè) -k ,第三列相同時(shí),按照第一列降序排列,數(shù)據(jù)符合預(yù)期
sort -t $'\t' -k 3n -k 1r sort.log
更換成從前往后
sort -t $'\t' -k 1 -k 3n sort.log
sort -t $'\t' -k 1 -k 3nr sort.log
通過 sort -t $'\t' -k 1 -k 3n sort.log 和 sort -t $'\t' -k 1 -k 3nr sort.log 返回的結(jié)果發(fā)現(xiàn),在第一列相等時(shí),無論其三列是正序排列,還是逆序排列,結(jié)果都一樣,說明后邊的 -k 未生效
當(dāng)指定 FEend 后
sort -t $'\t' -k 1,1 -k 3nr sort.log
3.4 作用域
緊跟在字段后的選項(xiàng)(如"-k3n"的"n"和"-k2nr"的"n","r")稱為私有選項(xiàng),使用短橫線寫在字段外的選項(xiàng)(如"-n"、"-r")為全局選項(xiàng)。當(dāng)沒有為字段分配私有選項(xiàng)時(shí),該排序字段將繼承全局選項(xiàng),所有選項(xiàng)包括但不限于"bfnrhM"
除了"b"選項(xiàng)外,其余選項(xiàng)無論是指定在FStart還是FEnd中都是等價(jià)的,對(duì)于"b"選項(xiàng),指定在FStart則作用于FStart,指定在FEnd則作用于FEnd
sort -t $'\t' -k1r,2 sort.log ,可以看出一、二列都是倒敘排列
3.5 注意
指定n選項(xiàng)按數(shù)值排序時(shí), 由于"n"選項(xiàng)只能識(shí)別數(shù)字和負(fù)號(hào)"-",當(dāng)排序時(shí)遇到無法識(shí)別字符時(shí),將導(dǎo)致該key的排序立即結(jié)束,n選項(xiàng)絕對(duì)不會(huì)跨域進(jìn)行比較
默認(rèn)情況下,sort會(huì)進(jìn)行一次 "最后的排序" ,按照默認(rèn)規(guī)則對(duì)整行進(jìn)行一次排序,這次排序稱為"最后的排序"
sort -t $'\t' -k3n sort.log ,在第三列相等時(shí),整行會(huì)按照 ASCII 進(jìn)行最后的升序排列
sort -t $'\t' -k3,4n -s sort.log ,加了 -s 后,不會(huì)進(jìn)行最后的排序(1000相同時(shí),e在b的前邊了),而是保留原排序
3.6 按照某個(gè)域中的第n個(gè)字符進(jìn)行排序
sort -t $'\t' -k2.3,2.3 sort.log ,按第二列第三個(gè)字符進(jìn)行排序
4、 -h 使用易讀性數(shù)字(例如:2K、1G)
sort -t $'\t' -k5h sort.log
sort -t $'\t' -k2,2 sort.log|uniq
sort -t $'\t' -k2,2 -u sort.log 會(huì)對(duì)第二列進(jìn)行去重,而 sort -t $'\t' -k2,2 sort.log|uniq 會(huì)對(duì)整行進(jìn)行去重(當(dāng)然uniq也可以按照第二列進(jìn)行去重)
sort整理完了,歡迎大牛指教
1、用CRT軟件連接一個(gè)Linux系統(tǒng) 。
2、打開需要查看的文件夾。 以 tmp為例。
3、用 ll 命令 查看有哪些文件。
4、默認(rèn)為按照大小進(jìn)行排序。 需要按照時(shí)間進(jìn)行排序。
5、用 ll -t ?命令進(jìn)行時(shí)間排序,這樣是默認(rèn)為降序。
6、用 ll -t | tar 命令進(jìn)行時(shí)間排序,這樣為升序。
一個(gè)比較經(jīng)典的問題:
如果線上機(jī)器的磁盤占用率超級(jí)高,怎么辦?
這時(shí)候優(yōu)先想到的肯定是,定位到占用磁盤空間最大的那些文件,然后把可以刪的給刪掉。
那么,問題來了,如何定位到占用磁盤空間最大的文件?
一個(gè)辦法是執(zhí)行如下命令:
里面涉及三個(gè)指令:du、sort、more
既然用到了,就順便多了解一下這三個(gè)指令的用法,算是做下個(gè)人筆記。
首先是du
作用:用來查看文件所占用的磁盤情況。
格式:du [選項(xiàng)] [文件]
可用選項(xiàng)(如下為du --help展示的內(nèi)容):
操作示例:
對(duì)幾個(gè)比較常用的選項(xiàng)單獨(dú)拿出來,在機(jī)器上實(shí)際操作,效果如下:
首先,當(dāng)前目錄如下:
du:
其實(shí)吧,從圖里面可以看到,使用“du”的時(shí)候,最后一行就當(dāng)前目錄的磁盤使用總量,所以,感覺一般情況下-c這個(gè)選項(xiàng)并沒有什么用。
du -s:只計(jì)算總量
不過,注意:-s與-a不能同時(shí)存在,會(huì)報(bào)錯(cuò)的。
sort
作用:對(duì)輸出的結(jié)果進(jìn)行排序
可用選項(xiàng):
-r:代表逆序排序
-n:按照字符串?dāng)?shù)值排序
-g:按照常規(guī)數(shù)值排序
-f:忽略字母大小寫
實(shí)測(cè)效果:
首先是測(cè)試文件的原始狀態(tài):
測(cè)試一:sort
可以發(fā)現(xiàn):
空行排在了第一位;
不管數(shù)字有多大,字符串都會(huì)排在數(shù)字的后面;
數(shù)字之間排序的時(shí)候,優(yōu)先考慮首位數(shù)字(感覺是把數(shù)字也當(dāng)成了一個(gè)字符串進(jìn)行排序);
more
作用:用于一頁一頁地展示文件內(nèi)容。
幾個(gè)常用操作:
空格:翻到下一頁
b:翻到上一頁
/:?jiǎn)?dòng)字符串搜索(類似于vim)
此外:
more +n XXX:從XXX文件的第n行開始展示
more -n XXX:展示XXX文件,并且將n行視為一頁,也就是按空格時(shí),只會(huì)顯示后續(xù)的N行
cat
作用:一次性的展示所有文件內(nèi)容
cat有兩個(gè)比較有用的選項(xiàng):
-n:輸出所有行號(hào)
-b:只對(duì)非空行輸出行號(hào)
此外,
cat支持同時(shí)輸出多個(gè)文件的內(nèi)容:cat XXX YYYY ZZZZ
并且,cat可以與more結(jié)合使用:cat XXX | more 或者 cat XXX YYYY ZZZZ | more 或者 cat -n XXX | more
less:
作用:對(duì)文件或者輸出內(nèi)容進(jìn)行分頁展示,并且less可以用于打開多個(gè)文件
常用操作:
j:向上滾動(dòng)一行
k:向下滾動(dòng)一行(類似于vim)
g:跳到第一行
G:跳到最后一行
b:向上翻一頁
空格:翻頁
n%:跳轉(zhuǎn)到整個(gè)文件的n%處
:e :在使用less打開多個(gè)文件時(shí),使用“:e”選擇跳轉(zhuǎn)到其他文件去
/:進(jìn)行字符串搜索
v:?jiǎn)?dòng)編輯
常用選項(xiàng):
-N:在每一行前面都顯示行號(hào)
-m:顯示讀取文件的百分比
-M:顯示讀取文件的百分比、行號(hào)和總行數(shù)
注意:
其他兩個(gè)比較簡(jiǎn)單的指令:
head:顯示一個(gè)文件的前N行
用法:head -n 行數(shù) 文件名
tail:顯示一個(gè)文件的最后N行
用法:tail -n 行數(shù) 文件名
不過,使用tai的時(shí)候,因?yàn)?f選項(xiàng)可以自動(dòng)顯示新增加的內(nèi)容,所以經(jīng)常會(huì)使用如下方式:
tail -f 文件名