CodeGym /Adesua ahorow /Docker SELF /排序和過濾文件:命令 `sort`, `uniq`, `cut`

排序和過濾文件:命令 `sort`, `uniq`, `cut`

Docker SELF
等級 8 , 課堂 3
開放

排序和過濾文件:命令 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. 實際範例:結合 sortuniqcut

我們來處理一個包含以下數據的日誌文件:

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
  1. 提取 IP 地址:
cut -d',' -f2 log.txt
  1. 刪除重複數據並計算次數:
cut -d',' -f2 log.txt | sort | uniq -c
  1. 按照出現次數排序:
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
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION