这 5 个 Linux 命令让读取大文件变得更容易
要点
- Linux 提供了管理大型文本文件和易失性数据流的工具。
- 使用“less”滚动、搜索和管理文件内容,或直接将输出通过管道传输到其中。
- 使用“split”分割大文件,有效管理块,并使用“head”和“tail”进行选择性查看。
如果您需要在非常大的文本文件中查找信息,Linux 可以直接提供您需要的所有工具。您还可以在实时文本流上使用它们。
信息过载
大多数时候,Linux 是非常守口如瓶的。你必须假设没有消息就是好消息。如果您的最后一个命令没有引发错误消息,您可以假设一切顺利。
有时,Linux 可能会淹没您大量的信息。在引入 systemd 和 Journalctl 之前,我们将在这里介绍的工具和技术将用于驯服庞大的日志文件,但它们可以应用于任何文件。
它们还可以应用于数据流和命令的输出。
使用较少
less 命令允许您使用向上箭头和向下箭头一次在文件中向前和向后滚动一行,或者使用 Page Up 和 Page Down 一次滚动一个屏幕,或者使用 Home 和 跳转到文件的开头或结尾结尾。
less words.txt
如果添加 -N(行号)命令行选项,则可以添加行号。
less -N words.txt
正如您所看到的,该文件中有数十万行,但即使在这个配置适度的虚拟机上,更少的行仍然相当少。
有用的是,less 具有搜索功能。按正斜杠 /,输入搜索线索,然后按 Enter。如果存在匹配项,则 less 会显示文件的该部分,并突出显示匹配项。
您可以通过按 n 从一场比赛跳转到另一场比赛。要执行相反的操作,请按 N。
通过使用管道,您可以将命令的输出直接发送到 less 中。
sudo ls -R / | less
就像处理文件一样,您可以向前和向后滚动并搜索字符串。
将流重定向到文件
将命令的输出通过管道传输到 less 非常适合一次性需求,但是一旦关闭 less,输出就会消失。如果您将来需要使用该输出,您应该制作它的永久副本并以更少的速度打开该副本。
通过将命令的输出重定向到文件中并使用 less 打开该文件,可以轻松完成此操作。
sudo ls -R / > listing-capture.txt
请注意,警告或错误会发送到终端窗口,以便您可以看到它们。如果它们被发送到文件中,您可能会错过它们。为了读取该文件,我们以通常的方式用 less 打开它。
less listing-capture.txt
> 运算符将输出重定向到指定文件,并每次都重新创建该文件。如果要在同一文件中捕获两组(或更多)不同的信息,则需要使用 >> 运算符将数据追加到现有文件中。
sudo ls -R /bin > listing-capture.txt
sudo ls -R /etc >> listing-capture.txt
请注意第二个命令中 >> 的使用。
less listing-capture.txt
通过捕获命令的输出,我们实际上捕获了三个 Linux 流之一。命令可以接受输入(流 0、STDIN)、生成输出(流 1、STDOUT),并且可以引发错误消息(流 2、STDERR)。
我们一直在捕获流 1,即标准输出流。如果您也想捕获错误消息,则需要同时捕获流 2,即标准错误流。我们需要使用这个看起来很奇怪的构造 2>&1,它将流 2 (STDERR) 重定向到流 1 (STDOUT)。
sudo ls -R / > listing-capture.txt 2>&1
您可以在文件中搜索字符串,例如警告、错误或您知道出现在错误消息中的其他短语。
less listing-capture.txt
将文件分割成更小的块
如果您的文件太大,以至于速度变慢并变得滞后,您可以将原始文件拆分为更易于管理的块。
我有一个名为 big-file.txt 的文件。它有 1.328 亿行文本,大小超过 2GB。
除非您尝试直接跳到文件的开头或结尾,或者尝试从文件末尾进行反向搜索,否则以较少的速度打开它就足够了。
它有效,但速度很慢。
这就是为什么我们有 split 命令。顾名思义,它将文件分割成更小的文件,保留原始文件。
您可以将文件拆分为指定数量的较小文件,也可以指定拆分文件的大小,然后 split 计算出要生成的文件数量。但这些策略会让您将行甚至单词分成两个文件。
因为我们正在处理文本,分割行和截断的单词会出现问题,所以指定按行数分割是有意义的。我们之前使用过 wc 命令,因此我们知道有多少行。
我使用了 -l(行)选项并指定了 500,000 行。我还使用 -d(数字)选项对文件进行顺序编号,并使用 -a(后缀长度)选项将数字用零填充到 3 位数字。 “chunk.”一词是分割文件名的前缀。
split -l 500000 -d -a 3 big-file.txt chunk.
在我们的示例中,这会创建 267 个文件(编号为 000 到 265),这些文件在功率适中的计算机上更易于管理。
wc chunk.001
wc chunk.002
wc chunk.080
wc chunk.265
除最后一个文件外,每个文件包含 500,000 个完整 行。该文件包含剩余的行数。
使用头和尾
head 和 tail 命令可让您查看文件顶部或末尾的选定行。
head chunk.199
tail chunk.199
默认情况下,会显示 10 行。您可以使用 -n(行)选项来请求更多或更少的行。
head -n 15 chunk.199
tail -n 3 chunk.199
如果您知道文件中您感兴趣的区域,则可以通过从尾部到头部的管道输出来选择该区域。唯一的怪癖是,您需要指定要查看的区域的第一行,从文件末尾向后计数,而不是从文件开头向前计数。
该文件有 500,000 行。如果我们想看到从第 1240 行开始的 20 行,我们需要告诉 tail 从第 500,000-1239 行开始,即 498761。注意,我们减去了我们想要开始的行数。
输出通过管道输送到显示前 20 行的 head 中。
tail -n 498761 chunk.199 | head -n 20
将输出与 less 中从第 1240 行开始显示的同一文件进行比较,我们可以看到它们匹配。
或者,您可以在感兴趣的第一行拆分文件,然后使用 head 查看新文件的顶部。
您可以使用 tail 执行的另一个技巧是监视不断变化的数据。如果您有一个像日志文件一样正在更新的文件,则 -f(跟随更改)选项会告诉 tail 在文件发生更改时显示文件的底部。
tail -f changing.log
使用 grep 过滤行
grep 命令非常强大。最简单的示例使用 grep 查找文件中包含搜索字符串的行。
grep stereo chunk.045
如果需要,我们可以使用 -n(行号)选项添加行号,以便可以在文件中找到这些行。 -T(制表符)选项将输出制成表格。
grep -n -T stereo chunk.045
搜索多个文件同样简单。
grep -n -T pamstereogram.1.gz chunk.*
每个匹配项都会给出文件名和行号。
您还可以使用 grep 搜索实时信息流。
./log.sh | grep MemAvailable
他们来得越大...
您可以随心所欲地使用 grep,并在搜索字符串中使用正则表达式。对于此处显示的所有命令,我建议查看它们的手册页。它们所做的事情比我在这里介绍的要多得多,并且它们的一些其他选项可能对您的特定用例有价值。