Linux中uniq命令简介
1. 概述
在本教程中,我们将探讨如何使用uniq 命令。
2. uniq
uniq命令为我们提供了一种简单的方法来过滤文本文件并从数据流中删除重复的行。
我们可以通过几种方式使用uniq。我们可以打印出唯一的行或重复的行。此外,uniq可以打印出每个不同的行,并计算该行在文件中出现的次数。
我们需要记住的一个重要方面是uniq与相邻行一起工作。这意味着我们通常需要先对数据进行排序,然后uniq才能处理文件。幸运的是,在 Linux 中,我们可以使用*sort * 命令来实现这一点。
让我们尝试在访问我们网络服务器的国家/地区列表中使用uniq 。首先,我们将创建一个名为countries.txt的文件:
$ cat << EOF > countries.txt
Germany
South Africa
Japan
USA
England
Spain
Italy
Cameroon
Japan
EOF
3. 打印重复行
在本例中,我们将使用uniq命令打印文件中的重复行。让我们对我们的数据进行排序并通过uniq管道来看看它是如何工作的:
$ sort countries.txt | uniq -d
Japan
在这里,我们在使用流重定向将数据传递给uniq之前对数据进行了排序。-d标志只向我们展示了重复行的一个实例。我们看到了“Japan”的输出,因为这是唯一的重复。
现在让我们看一下这个的快速变化:
$ sort countries.txt | uniq -D
Japan
Japan
在我们的变体中,我们将-D标志传递给uniq,它会打印所有重复行的实例。**
4. 计算重复行
让我们看看如何快速轻松地计算数据中的重复项:
$ sort countries.txt | uniq -c
1 Cameroon
1 England
1 Germany
1 Italy
2 Japan
1 South Africa
1 Spain
1 USA
使用-c*标志,uniq在每一行前面加上它在文件中出现的次数并将其打印到屏幕上。*
5. 删除重复行
现在我们将使用uniq完全删除重复的行,并只向我们展示那些在countries.txt文件中只出现一次的国家。
我们通过uniq的*-u* 标志来实现这一点:
$ sort countries.txt | uniq -u
Cameroon
England
Germany
Italy
South Africa
Spain
USA
正如预期的那样,“Japan”不在输出中,因为它在我们的文件中出现了不止一次,因此不被视为唯一记录。
6. 区分大小写
在现实世界中,我们的数据可能更加不一致。让我们更新我们的示例数据文件并使用不同案例的混合作为测试:
$ cat << EOF > countries.txt
GERMANY
South AFRICA
Japan
USA
england
Spain
ItaLY
CaMeRoon
JAPAN
EOF
现在让我们尝试打印此文件中的重复项:
$ sort countries.txt | uniq -D
奇怪的是,我们的输出是空白的。我们知道日本是重复的,应该打印,但奇怪的情况可能是问题所在。
让我们看看如何在uniq中使用*-i*标志来解释这一点:
$ sort countries.txt | uniq -D -i
Japan
JAPAN
我们可以通过计算Japan出现在文件中的次数来进一步确认:
$ sort countries.txt | uniq -c -i -d
2 Japan
通过使用-i,我们要求uniq在搜索重复项时执行不区分大小写的比较。**
7. 跳过字符
有时我们可能希望在查找重复值时跳过或忽略一定数量的字符。我们可以在uniq中使用*-s*标志来实现这一点。 首先,让我们为此示例创建一些示例数据:
$ cat << EOF > visitors.txt
Visitor from Cameroon
Visitor from England
Visitor from Germany
Visitor from Italy
Visitor from Japan
Visitor from Japan
Visitor from South Africa
Visitor from Spain
Visitor from USA
EOF
现在我们已经创建了数据,我们将传递*-s* 从行首开始跳过的字符数:
$ uniq -s 13 -c visitors.txt
1 Visitor from Cameroon
1 Visitor from England
1 Visitor from Germany
1 Visitor from Italy
2 Visitor from Japan
1 Visitor from South Africa
1 Visitor from Spain
1 Visitor from USA
在这个例子中,我们使用了*-s标志来告诉uniq跳过每行的前 13 个字符。这样做会使uniq只剩下要过滤的国家/地区名称,而且正如预期的那样,只有日本在我们的visitor.txt*文件中出现了两次。
8. 前*n *个字符
我们能够限制uniq在搜索重复项时用于比较的字符数。
让我们看一下如何使用*-w选项来比较visitor.txt*文件中每行的前七个字符:
$ uniq -w 7 -c visitors.txt
9 Visitor from Cameroon
*使用-w标志时,我们必须注意不要与uniq 的输出混淆。**这里的输出告诉我们文件中的前七个字符在visitor.txt*中匹配了九次。
9. 忽略字段
我们可能希望uniq在执行重复搜索时忽略每行上的特定数量的字段,这就是*-f*选项发挥作用的地方:
$ uniq -f 2 -D visitors.txt
Visitor from Japan
Visitor from Japan
在这个例子中,我们已经要求uniq忽略每一行的前两个字段。字段是由空格分隔的一组字符,因此我们忽略了每一行上的*“Visitor from”*文本。