Linux 的 look 命令能搜索文件,并列出所有以特定词语或短语开头的行。但是请注意,它在不同的 Linux 发行版中的表现可能有所不同。本教程将向您展示如何使用这个命令。
Ubuntu 的 look 命令行为差异
对于一个简单却实用的命令来说,look 在我研究这篇文章时确实帮助了我不少。但有两个主要问题:兼容性和文档说明。
本文使用了 Ubuntu、Fedora 和 Manjaro 进行测试。look 命令在这三个发行版中都有自带,这很好。然而,问题是它们三者的行为方式并不一致。Ubuntu 版本的差异尤为明显。尽管根据 Ubuntu 手册页的描述,其行为本应是一致的。
我最终弄清楚了。传统上,look 命令采用二分查找算法,而 Ubuntu 的 look 命令却使用线性搜索。尽管 Bionic Beaver (18.04)、Cosmic Cuttlefish (18.10) 和 Disco Dingo (19.04) 的在线 Ubuntu 手册页都声称其版本使用了二分查找,但实际情况并非如此。
如果我们查看本地 Ubuntu 手册页,我们会发现它明确指出其 look 命令使用线性搜索。它提供了一个命令行选项,可以强制使用二分查找。而其他发行版中的任何版本都没有提供在两种搜索方法之间进行选择的选项。
man look
向下滚动手册页,我们能看到明确描述此版本 look 命令使用线性而非二分查找的部分。
这里需要谨记的是,一定要先查阅本地手册页。
线性搜索与二分搜索
二分查找比线性搜索更快且更有效。在处理大文件时,这一点尤为明显。二分查找的缺点是需要对文件进行排序。如果您不想对原始文件进行排序,可以对其副本进行排序,然后将其与 look 命令一起使用。
本文后续部分将演示如何操作。请注意,在 Fedora 和 Manjaro 系统中(以及 Linux 世界中的其他大多数地方),您需要创建排序后的文件副本并使用它。
关于安装
look 命令可以与任何文本文件一起使用,也可以与本地字典文件“words”一起使用。
在 Manjaro 系统中,您可能需要安装 “words” 文件。可以使用以下命令:
sudo pacman -Syu words
使用 look 命令
在本文中,我们将使用爱德华·李尔的诗歌《杂乱无章》(The Jumblies)。
让我们用以下命令查看它的内容:
less the-jumblies.txt
这是这首诗的第一部分。请注意,我们使用的是 Ubuntu 系统,因此文件尚未排序。对于 Fedora 和 Manjaro 系统,我们会使用文件的排序副本,后续文章将介绍如何操作。
如果我们搜索以单词 “They” 开头的行,我们会发现一些关于 Jumblies 的描述。
look They the-jumblies.txt
这是 look 命令的输出结果:
忽略字符大小写
要让 look 命令忽略大小写之间的差异,请使用 -f(忽略大小写)选项。我们再次使用 “they” 作为搜索词,这次使用小写。
look -f they the-jumblies.txt
这一次,结果多包含了一行。
以 “THEY” 开头的行在上一个结果集中被忽略了,因为它都是大写,与我们的搜索词 “they” 不匹配。
忽略大小写可以让 look 命令将它包含在结果中。
在排序的文件中使用 look
如果您的 Linux 发行版中 look 命令的行为与传统上使用二分查找的行为一致,您必须对文件进行排序或使用排序后的文件副本。
让我们在 Manjaro 系统上重复搜索 “they” 的命令。
正如您看到的,没有返回任何结果。但我们知道这首诗中有几行是以 “they” 开头的。
让我们创建一个文件的排序副本。如果要使用 -f(忽略大小写)或 -d(仅限字母数字字符和空格)选项,则必须在对文件进行排序时使用它们。
-o(输出)选项允许您指定应将排序后的行添加到哪个文件中。在本例中,它是 “sorted.txt”。
sort -f -d the-jumblies.txt -o sorted.txt
让我们检查 sorted.txt 文件,并使用 -f 和 -d 选项。
现在,我们得到了预期结果。
仅考虑空格和字母数字字符
要让 look 命令忽略任何非字母数字字符或空格,请使用 -d(字母数字)选项。
让我们看看是否有任何以 “Oh” 开头的单词。
look -f oh the-jumblies.txt
look 命令没有返回任何结果。
让我们再次尝试,告诉 look 命令忽略字母数字字符和空格之外的任何内容。这意味着字符和符号(例如标点符号)将被忽略。
look -f -d oh the-jumblies.txt
这一次,我们得到了一条结果。之前我们没有找到这一行,是因为引号和感叹号干扰了搜索。
指定终止符
您可以告诉 look 命令使用特定字符作为终止符。通常,空格和行尾用作终止符。
-t(终止字符)选项允许我们指定我们想要使用的字符。在此示例中,我们将使用撇号字符。我们需要用反斜杠来引用它,这样 look 命令才能识别它不是字符串的起始符。
我们还引用了搜索词,因为它包含空格。我们正在搜索两个单词。
look -f -t \' "they call" the-jumblies.txt
结果与我们的搜索词匹配,并由我们用作终止符的撇号终止。
在不使用文件的情况下使用 look
如果在命令行中不提供文件名,look 命令将使用单词文件。
命令:
输出结果如下:
这些都是单词文件中所有以“circle”开头的单词。
总结
以上就是关于 look 命令的所有内容。
一旦您了解不同 Linux 发行版中存在不同的行为方式,并确定您的版本是使用二分查找还是线性搜索,您就可以轻松自如地使用这个命令了。