如何在Linux上使用uniq命令

时间:2020-01-09 10:39:56  来源:igfitidea点击:

Linux的" uniq"命令会在文本文件中快速查找唯一或者重复的行。在本指南中,我们介绍了它的多功能性和功能,以及如何充分利用这个漂亮的实用程序。

在Linux上查找文本的匹配行

" uniq"命令快速,灵活,并且功能强大。但是,就像许多Linux命令一样,只要我们了解它们,它也会有一些怪癖。如果我们在没有任何内幕专业知识的情况下进行尝试,那么我们很可能会为结果感到挠头。

" uniq"命令非常适合那些专一,一劳永逸的人。这就是为什么它也特别适合与管道一起工作并在命令管道中发挥作用的原因。它的最常用的协作者之一是sort,因为uniq必须对要处理的输入进行排序。

不带选项运行uniq

我们有一个文本文件,其中包含罗伯特·约翰逊(Robert Johnson)的歌曲《我相信我会把我的扫帚除尘》的歌词。让我们看看" uniq"是如何构成的。

我们将输入以下内容以将输出通过管道传递到less

uniq dust-my-broom.txt | less

我们在less中获得整首歌曲,包括重复的行:

似乎既不是唯一的行也不是重复的行。

对,因为这是第一个怪癖。如果我们运行不带任何选项的uniq,它的行为就像我们使用了-u(唯一行)方法一样。这告诉uniq只打印文件中的唯一行。我们看到重复行的原因是,为了使" uniq"将行视为重复行,它必须与它的重复行(即sort)所在的行相邻。

当我们对文件进行排序时,它会将重复的行进行分组,然后用" uniq"将它们视为重复的行。我们将在文件上使用" sort",将排序后的输出通过管道传递给" uniq",然后将最终输出通过管道传递给" less"。

为此,我们键入以下内容:

sort dust-my-broom.txt | uniq | less

行的排序列表以less出现。

我相信我会扫帚,这首歌肯定出现在这首歌中不止一次。实际上,它在歌曲的前四行中重复了两次。

那么,为什么它显示在唯一行列表中?因为第一次在文件中出现一行,所以它是唯一的。仅后续条目重复。我们可以将其视为列出每个唯一行的第一个匹配项。

让我们再次使用sort并将输出重定向到一个新文件。这样,我们不必在每个命令中都使用sort

我们输入以下命令:

sort dust-my-broom.txt > sorted.txt

现在,我们有一个预排序的文件可以使用。

计数重复

我们可以使用-c(计数)选项来打印每行出现在文件中的次数。

键入以下命令:

uniq -c sorted.txt | less

每行以该行出现在文件中的次数开头。但是,我们会注意到第一行是空白。这告诉我们文件中有五个空白行。

如果要按数字顺序对输出进行排序,则可以将输出从" uniq"馈送到" sort"。在我们的示例中,我们将使用-r(反向)和-n(数字排序)选项,并将结果传递给less

我们输入以下内容:

uniq -c sorted.txt | sort -rn | less

该列表根据每行出现的频率以降序排列。

只列出重复的行

如果只想查看文件中重复的行,则可以使用-d(重复)选项。无论文件中一行被重复多少次,它只会被列出一次。

要使用此选项,我们输入以下内容:

uniq -d sorted.txt

为我们列出了重复的行。我们会注意到顶部的空白行,这意味着该文件包含重复的空白行,这不是uniq留下的空格,可以用美观的方式偏移列表。

我们也可以结合使用-d(重复)和-c(计数)选项,并通过sort传递输出。这给了我们至少出现两次的行的排序列表。

输入以下内容以使用此选项:

uniq -d -c sorted.txt | sort -rn

列出所有重复的行

如果要查看每个重复行的列表,以及每次在文件中出现一行的条目,则可以使用-D(所有重复行)选项。

要使用此选项,请键入以下内容:

uniq -D sorted.txt | less

该列表包含每个重复行的条目。

如果使用--group选项,它将在每个组之前(prepend)或者之后(append)或者在每个组之前和之后(both)都打印空白行。

我们使用append作为我们的修饰符,因此我们输入以下内容:

uniq --group=append sorted.txt | less

这些组用空行分隔,以使它们更易于阅读。

检查一定数量的字符

默认情况下," uniq"检查每行的整个长度。但是,如果要将检查限制为一定数量的字符,则可以使用-w(检查字符)选项。

在此示例中,我们将重复最后一个命令,但是将比较限制为前三个字符。为此,我们键入以下命令:

uniq -w 3 --group=append sorted.txt | less

我们收到的结果和分组是完全不同的。

所有以I b开头的行都被分组在一起,因为这些行的那些部分是相同的,因此它们被认为是重复的。

同样,以I开头的所有行都被视为重复行,即使文本的其余部分不同。

忽略一定数量的字符

在某些情况下,在每一行的开头略过一定数量的字符可能是有益的,例如对文件中的行进行编号时。或者,说我们需要uniq跳过时间戳并开始检查字符6而不是第一个字符的行。

下面是带有编号行的已排序文件的版本。

如果我们希望uniq在第三个字符处开始比较检查,则可以通过键入以下命令来使用-s(跳过字符)选项:

uniq -s 3 -d -c numbered.txt

将这些行检测为重复行并正确计数。注意,显示的行号是每个重复项第一次出现的行号。

我们也可以跳过字段(一串字符和一些空格)来代替字符。我们将使用-f选项来告诉uniq要忽略哪些字段。

我们输入以下内容告诉uniq忽略第一个字段:

uniq -f 1 -d -c  numbered.txt

当我们告诉uniq在每一行的开头跳过三个字符时,我们得到的结果相同。

忽略大小写

默认情况下," uniq"区分大小写。如果相同的字母显示为大写且小写,则`uniq'认为行是不同的。

例如,检查以下命令的输出:

uniq -d -c sorted.txt | sort -rn

我相信我会dust帚的行和我相信我会dust帚的行不会被重复处理,因为B的大小写有所不同。

但是,如果我们包含" -i"(忽略大小写)选项,则这些行将被视为重复行。我们输入以下内容:

uniq -d -c -i sorted.txt | sort -rn

现在,这些行被视为重复行并分组在一起。

Linux提供了许多特殊实用程序供我们使用。与许多其他工具一样," uniq"并不是我们每天都会使用的工具。