如何在 Linux 上使用 uniq 命令

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

在 Linux 上查找匹配的文本行

uniq 命令是 快速、灵活、擅长它的工作. 然而,就像许多 Linux 命令一样,它也有一些怪癖——这很好,只要你知道它们。 如果你在没有一点内幕知识的情况下冒险冒险,你很可能会对结果摸不着头脑。 我们将在进行过程中指出这些怪癖。

uniq 命令非常适合那些一心一意、只做一件事、做好自己的阵营的人。 这就是为什么它也特别适合使用管道并在命令管道中发挥作用。 它的一个 最频繁的合作者 是排序,因为 uniq 必须对输入进行排序才能工作。

让我们点燃它!

无选项运行 uniq

我们有一个包含歌词的文本文件 罗伯特·约翰逊 歌曲 我相信我会弄脏我的扫帚. 让我们看看 uniq 是怎么做的。

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

uniq dust-my-broom.txt | less

这

我们得到整首歌,包括重复的行,更少:

从输出

这似乎既不是独特的线条也不是重复的线条。

对——因为这是第一个怪癖。 如果您在没有选项的情况下运行 uniq,它的行为就像您使用了 -u(唯一行)选项一样。 这告诉 uniq 只打印文件中唯一的行。 您看到重复行的原因是,为了让 uniq 将一行视为重复行,它必须与其重复行相邻,这就是排序的用武之地。

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

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

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

这

排序后的行列表出现在 less 中。

“我相信我会把扫帚除尘”这句台词肯定不止一次地出现在这首歌中。 事实上,它在歌曲的前四行中重复了两次。

那么,为什么它会出现在唯一行列表中? 因为一行第一次出现在文件中时,它是唯一的; 只有后续条目是重复的。 您可以将其视为列出每个唯一行的第一次出现。

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

我们输入以下命令:

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

这 sorted.txt”命令在终端窗口中。 宽度=”646″ 高度=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”>

  如何在 Linux 上玩 Spelunky

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

计算重复

您可以使用 -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(计数)选项,并通过排序管道输出。 这为我们提供了至少出现两次的行的排序列表。

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

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

这

列出所有重复的行

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

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

uniq -D sorted.txt | less

这

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

如果您使用 –group 选项,它会在每个组之前(前置)或之后(附加)或在每个组之前和之后(两者)都打印每个重复的行,并带有一个空行。

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

uniq --group=append sorted.txt | less

这

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

从输出

检查一定数量的字符

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

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

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

这

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

从输出

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

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

忽略一定数量的字符

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

  如何在 Linux 上使用 Pale Moon 浏览器

下面是我们排序文件的一个版本,带有编号的行。

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

uniq -s 3 -d -c numbered.txt

这

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

您还可以跳过字段(一系列字符和一些空格)而不是字符。 我们将使用 -f (fields) 选项告诉 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——我们可能有一篇文章。