CodeGym /课程 /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