如何在 Linux 上使用 uniq 命令

Linux uniq 命令:文本行处理的利器

Linux uniq 命令是一个强大的工具,用于在文本文件中快速定位唯一或重复的行。本文将深入探讨其多功能性和强大功能,并指导您如何充分利用这个出色的实用程序。

在Linux系统中查找匹配的文本行

uniq 命令以其速度、灵活性和专注性而闻名。然而,像许多 Linux 命令一样,它也有一些需要注意的特性。理解这些特性至关重要,否则您可能会对结果感到困惑。 我们将在本文中逐步揭示这些特性。

uniq 命令非常适合那些专注于做好一件事的工具。 这也是为什么它特别适合在命令管道中使用。uniq 命令最常见的搭配是 sort 命令,因为 uniq 只有在输入排序后才能正常工作。

让我们开始探索吧!

不带选项运行 uniq 命令

我们有一个包含歌曲歌词的文本文件,该歌曲来自 Robert Johnson“I Believe I’ll Dust My Broom”。 让我们看看 uniq 在这里的表现。

我们将输入以下命令,将输出通过管道传输到 less

uniq dust-my-broom.txt | less

我们得到的是整首歌,包括重复的行,使用 less 显示:

这似乎既没有显示唯一的行,也没有显示重复的行。

没错,这就是 uniq 的第一个特性。 如果您在没有选项的情况下运行 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’m” 开头的行也被视为重复行,即使文本的其余部分不同。

忽略指定数量的字符

在某些情况下,跳过每行开头的特定数量的字符可能是有益的,例如当文件中的行被编号时。或者,假设您需要 uniq 跳过时间戳并从第 6 个字符开始检查行,而不是从第一个字符开始检查。

下面是我们排序后的文件的一个版本,其中包含编号的行。

如果我们希望 uniq 在第 3 个字符处开始比较检查,我们可以通过输入以下命令使用 -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

由于“believe”中“B”的大小写不同,“我相信我会为我的扫帚除尘”和“我相信我会为我的扫帚除尘”这行不被视为重复。

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

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

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

Linux 提供了许多特殊的实用程序供您使用。 像它们中的许多一样,uniq 不是您每天都会使用的工具。

这就是为什么掌握 Linux 的一个重要部分是记住哪个工具可以解决您当前的问题,以及在哪里可以再次找到它。 不过,如果您多加练习,您将做得很好。

或者,您可以随时搜索 How-To Geek——我们可能有相关的文章。