文件排序和过滤:命令 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