排序和過濾文件:命令 sort
, uniq
, cut
1. 指令 sort
sort
指令是用來對文字檔案中的行進行排序的。它可以處理各種文字格式:從一般的簡單文字到 CSV。預設情況下,它會按字母順序排序行。不過,還有很多選項讓你可以做到更棒的事情。
基本語法
sort [選項] 檔案
簡單範例
假設我們有一個名字為 names.txt
的檔案,內容如下:
Charlie
Alice
Bob
David
我們可以這樣按字母順序排序它:
sort names.txt
結果:
Alice
Bob
Charlie
David
sort
的主要選項
反向排序
如果你想按降序排列行,請使用選項 -r
:
sort -r names.txt
結果:
David
Charlie
Bob
Alice
數值排序
對於數字,字母排序可能會不正確。例如,以下是檔案 numbers.txt
的內容:
10
2
5
1
字母排序結果將是:
1
10
2
5
但是使用選項 -n
(數值排序):
sort -n numbers.txt
結果將正確:
1
2
5
10
忽略空格
有時候行的開頭或結尾會有空格。為了避免 sort
搞混,請使用選項 -b
:
sort -b 髒檔案.txt
範例
假設我們有一個網站訪問記錄檔 visits.log
:
user2 15
user1 5
user3 30
user4 20
我們想通過訪問數量(第二列)對使用者進行排序,可以這樣做:
sort -k2 -n visits.log
其中 -k2
表示“使用第二列進行排序”。結果:
user1 5
user2 15
user4 20
user3 30
2. 命令 uniq
命令 uniq
用於移除檔案中重複的行。但是要注意:它只對連續的重複項目有效。也就是說,如果相同的行出現在檔案的不同部分,必須先排序。
基本語法
uniq [選項] 檔案
簡單範例
假設我們有一個檔案 colors.txt
:
red
green
green
blue
blue
blue
red
如果我們只用 uniq
:
uniq colors.txt
結果是:
red
green
blue
red
移除所有重複項目
首先排序檔案:
sort colors.txt | uniq
結果:
blue
green
red
uniq
的關鍵選項
計算重複次數
如果你想知道每一行出現的次數,可以使用選項 -c
:
sort colors.txt | uniq -c
結果:
3 blue
2 green
2 red
範例
在檔案 access.log
中,我們有一個 IP 地址列表:
192.168.0.1
192.168.0.2
192.168.0.1
192.168.0.3
192.168.0.1
我們想知道哪個 IP 出現次數最多:
sort access.log | uniq -c | sort -rn
結果:
3 192.168.0.1
1 192.168.0.2
1 192.168.0.3
3. 命令 cut
命令 cut
能夠提取特定的行内容部分,比如 CSV 文件中的特定列或字符範圍。
基本語法
cut [選項] 文件
簡單範例
文件 data.csv
:
Alice,25,Developer
Bob,30,Designer
Charlie,22,Manager
提取只有名字(第一列):
cut -d',' -f1 data.csv
結果:
Alice
Bob
Charlie
其中:
-d','
— 分隔符(逗號)。-f1
— 欲提取的字段(列)。
cut
的關鍵選項
選擇字符範圍
如果我們的文件 data.csv
中有固定宽度的列:
Alice 25 Developer
Bob 30 Designer
Charlie 22 Manager
我們可以只提取年齡(從第 12 到 14 個字符):
cut -c12-14 data.csv
結果:
25
30
22
選擇多個字段
如果我們有文件 log.csv
:
2023-01-01,INFO,Server started
2023-01-02,ERROR,Connection failed
2023-01-03,INFO,Server stopped
只選取日期和日誌級別(字段 1 和 2):
cut -d',' -f1,2 log.csv
結果:
2023-01-01,INFO
2023-01-02,ERROR
2023-01-03,INFO
4. 實際範例:結合 sort
、uniq
和 cut
我們來處理一個包含以下數據的日誌文件:
user1,192.168.0.1
user2,192.168.0.2
user1,192.168.0.1
user3,192.168.0.3
user2,192.168.0.2
- 提取 IP 地址:
cut -d',' -f2 log.txt
- 刪除重複數據並計算次數:
cut -d',' -f2 log.txt | sort | uniq -c
- 按照出現次數排序:
cut -d',' -f2 log.txt | sort | uniq -c | sort -rn
結果:
2 192.168.0.2
2 192.168.0.1
1 192.168.0.3
GO TO FULL VERSION