Linux sort命令使用示例

我們在開發、維護的過程中,有時會需要將log、數據等做過濾和篩選

例如,我們有這樣一個文件 daily_pv.txt ,它可能有10W行,其部分內容如下:

20170702    a   52331
20170703    a   63210
20170701    b   234213
20170703    b   341000
20170701    a   52103
20170702    b   233333

三列數據 分別對應了日期、地區標識、PV。此時我們可能需要將其按照時間排序,或是按照PV排序,方便我們進行分析。

很多時候我們的第一反應是寫一小段代碼,將文件讀取到內存中,做排序然後再輸出。這個方法是很好,但是比較費時,而我們使用一條shell命令就可以搞定。

但我們應該如何寫呢?

首先讓我們瞭解一下sort命令:

sort命令可以讓我們快速的對數據進行排序,其語法及常用參數格式如下

sort [-bcfMnrtk][源文件][-o]

-b 忽略每行開頭的空白字符
-c 檢查文件是否已經按照順序排序
-f 排序時,忽略大小寫字母
-M 將前3個字母依照月份縮寫進行排序
-n 依照數值大小進行排序
-o 排序結果輸出文件路徑
-r 逆序
-t 指定排序時以什麼字符來分隔各欄位
-k 選擇以-t分隔後的哪個區間來作爲排序字段

讓我們直接以上面的 daily_pv.txt 文件作爲例子來演示

1、 不加任何參數,此時會按照每一行從頭到尾的ASIIC碼順序來做排序

$ sort daily_pv.txt
20170701        a       52103
20170701        b       234213
20170702        a       52331
20170702        b       233333
20170703        a       63210
20170703        b       341000

2、按照第三欄的數字大小作爲排序依據(記得要加-n,不然會按照ASIIC順序做排序,則會把233333做爲最小,而63210作爲最大)

$ sort -t $'\t' -k 3 -n daily_pv.txt
20170701        a       52103
20170702        a       52331
20170703        a       63210
20170702        b       233333
20170701        b       234213
20170703        b       341000

細心的同學可能會注意到我們使用了 $’\t’ 來表示製表符,這是因爲在sort命令中如果指定的分隔符是 ‘\t’,則需要用美元符$來表示它本來的意思,否則sort無法識別’\t’,而如果是其他的字符例如”,就不存在這個問題,當然我們也可以加上 $ ,這是完全沒有問題的。

3、只查看a的pv,按照日期排序

$ sort daily_pv.txt | grep a
20170701        a       52103
20170702        a       52331
20170703        a       63210

此時我們需要配合 grep 來進行食用,通過管道命令”|” 將前一個指令的輸出作爲後一個指令的輸入。從而實現我們的過濾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章