如何使用 Linux cat 和 tac 命令

cat
和 tac
命令显示文本文件的内容,但它们所包含的远不止这些。更深入地学习一些高效的 Linux 命令行技巧。
这是两个简单的小命令,经常因为太简单而没有任何实际用途而被忽视。但是,一旦您知道可以使用它们的不同方式,您就会发现它们完全有能力在处理文件时完成应有的繁重工作。
猫命令
cat
用于检查文本文件的内容,并将文件的各个部分连接在一起形成一个更大的文件。
曾几何时——回到拨号调制解调器时代——二进制文件通常被分成几个较小的文件,以便于下载。您没有下载一个大文件,而是撤回了每个较小的文件。如果单个文件未能正确下载,您只需重新检索该文件即可。
当然,您随后需要一种方法将较小文件的集合重新构造回单个工作二进制文件。该过程称为连接。这就是 cat
出现的地方,也是它的名字的来源。
宽带和光纤连接已经导致这种特殊需求逐渐消失——就像刺耳的拨号音一样——那么今天 cat
还有什么可做的呢?实际上相当多。
显示文本文件
要让 cat
将文本文件的内容列出到终端窗口,请使用以下命令。
确保文件是文本文件。如果您尝试将二进制文件的内容列出到终端窗口,结果将不可预测。您最终可能会锁定终端会话或更糟。
cat poem1.txt

文件 poem1.txt 的内容显示在终端窗口中。

这只是著名诗歌的一半。剩下的在哪里?这里还有一个名为 poem2.txt 的文件。我们可以让 cat
用一个命令列出多个文件的内容。我们需要做的就是在命令行中按顺序列出文件。
cat poem1.txt poem2.txt

那看起来更好;我们现在有了整首诗。

少用猫
这首诗就在那里,但它飞快地从窗前掠过,我没能读懂前几节。我们可以将 cat
的输出通过管道传输到 less
中,然后按照我们自己的节奏向下滚动文本。
cat poem1.txt poem2.txt | less

我们现在可以在一个流中前后移动文本,即使它保存在两个单独的文本文件中。

给文件中的行编号
我们可以让 cat 在显示时对文件中的行进行编号。为此,我们使用 -n
(数字)选项。
cat -n poem1.txt

这些行在终端窗口中显示时编号。

不要给空行编号
我们设法用 cat
对行进行了编号,但诗句之间的空白行也被计算在内。要对文本行进行编号但忽略空行,请使用 -b
(number-nonblank) 选项。
cat -b poem1.txt

现在文本行被编号,空白行被跳过。

不要显示多个空行
如果文件中有连续空行的部分,我们可以要求 cat
忽略除一个空行之外的所有空行。看看这个文件。

下一个命令将导致 cat
从每一组空行中只显示一个空行。我们需要实现这一点的选项是 -s
(挤压空白)选项。
cat -s poem1.txt

这不会以任何方式影响文件的内容;它只是改变了 cat
显示文件的方式。

显示标签
如果您想知道空格是由空格还是制表符引起的,可以使用 -T
(show-tabs) 选项查明。
cat -T poem1.txt

选项卡由字符“^I”表示。

显示行尾
您可以使用 -E
(显示结束)选项检查尾随空格。
cat -E poem1.txt

行尾由“$”字符表示。

连接文件
将一首诗保存在两个文件中是没有意义的,每个文件各占一半。让我们将它们连接在一起并制作一个包含整首诗的新文件。
cat poem1.txt poem2.txt > jabberwocky.txt

让我们使用 cat
来检查我们的新文件:
cat jabberwocky.txt

我们的新文件包含其他两个文件的内容。

将文本附加到现有文件
这样更好,但实际上,这不是全诗。最后一句不见了。 Jabberwocky 中的最后一节与第一节相同。
如果我们有文件中的第一节,我们可以将其添加到 jabberwocky.txt 文件的底部,这样我们就会有完整的诗。
在下一个命令中,我们必须使用 >>
,而不仅仅是 >
。如果我们使用单个 >
,我们将覆盖 jabberwocky.txt。我们不想那样做。我们想在它的底部附加文本。
cat first_verse.txt >> jabberwocky.txt

让我们检查一下 jabberwocky.txt 文件的内容:
cat jabberwocky.txt

最后,这首诗的所有部分都在一起了。

重定向标准输入
您可以使用 cat
将键盘输入重定向到一个文件中。您键入的所有内容都会重定向到文件中,直到您按下 Ctrl+D。请注意,我们使用单个 >
因为我们要创建文件(或覆盖它,如果它存在)。
cat > my_poem.txt

我们一发出命令就可以开始打字。完成后我们按 Ctrl+D。然后我们可以检查新文件的内容:
cat my-poem.txt

那听起来像是遥远的涡轮机的声音可能是刘易斯卡罗尔在他的坟墓中高速旋转。
tac 命令
tac
类似于cat
,但它以相反的顺序列出文件的内容。
让我们看看:
tac my_poem.txt

文件以相反的顺序列在终端窗口中。在这种情况下,并不影响其文学价值。

将 tac 与标准输入一起使用
使用不带文件名的 tac
将导致它对键盘输入进行操作。按 Ctrl+D 将停止输入阶段,tac 将以相反的顺序列出您输入的内容。
tac

当按下 Ctrl+D 时,输入被反转并列在终端窗口中。

将 tac 与日志文件一起使用
tac
除了低级的小把戏之外,还能做点什么有用的事情吗?是的,它可以。许多日志文件在文件底部附加最新的条目。使用 tac
(与直觉相反,head
)我们可以将最后一个条目弹出到终端窗口中。
我们使用 tac
反向列出系统日志文件,并将其通过管道传输到 head
中。通过告诉 head
只打印它收到的第一行(感谢 tac
是文件中的最后一行),我们可以看到系统日志文件中的最新条目。
tac /var/log/syslog | head -1

head
打印 syslog 文件中的最新条目,然后退出。
请注意,head
只打印了一行——正如我们所要求的——但这行太长了,它绕了两圈。这就是为什么它在终端窗口中看起来像三行输出。

将 tac 与文本记录一起使用
tac
袖手旁观的最后一招很漂亮。
通常,tac
通过从下到上逐行处理文本文件来操作文本文件。一行是由换行符终止的字符序列。但是我们可以告诉 tac
使用其他分隔符。这允许我们将文本文件中的数据“块”视为数据记录。
假设我们有一个来自某个程序的日志文件,我们需要查看或分析。让我们用 less
看看它的格式。
less logfile.dat

正如我们所看到的,文件有一个重复的格式。有三行十六进制值的序列。每组三行十六进制都有一个以“=SEQ”开头的标签行,后跟一串数字。

如果我们滚动到文件的底部,我们可以看到有很多这样的记录。最后一个编号为 865。

让我们假设无论出于何种原因,我们需要以相反的顺序处理这个文件,一个数据记录一个数据记录。每个数据记录中三个十六进制行的行顺序必须保留。
我们会注意到文件中的最后三行以十六进制值 93、E7 和 B8 开头,顺序如下。
让我们使用 tac
来反转文件。这是一个非常长的文件,因此我们将其通过管道传输到 less
中。
tac logfile.dat | less

这会反转文件,但这不是我们想要的结果。我们希望文件被反转,但是每条数据记录中的行必须是它们原来的顺序。

我们之前记录了文件中的最后三行以十六进制值 93、E7 和 B8 开头,顺序是这样。这些行的顺序已颠倒。此外,“=SEQ”行现在位于每组三个十六进制行的下方。
tac
来救援。
tac -b -r -s ^=SEQ.+[0-9]+*$ logfile.dat | less

让我们分解一下。
-s
(分隔符)选项告知 tac
我们希望将什么用作记录之间的分隔符。它告诉 tac
不要使用它通常的换行符,而是使用我们的分隔符。
-r
(regex) 选项告诉 tac
将分隔符字符串视为正则表达式。
-b
(之前)选项导致 tac
在每条记录之前列出分隔符,而不是在它之后(这是它默认的通常位置分隔符,换行符)。
-s
(分隔符)字符串^=SEQ.+[0-9]+*$
解密如下:
^
字符代表行的开始。随后是 =SEQ.+[0-9]+*$
。这指示 tac
查找每次出现的“=SEQ”。在一行的开头,后跟任何数字序列(由 [0-9]
表示),然后是任何其他字符集(由 *$
表示) ).
像往常一样,我们将所有内容都传输到 less
中。

我们的文件现在以相反的顺序呈现,每个“=SEQ”标签行都列在其三行十六进制数据的之前。三行十六进制值在每个数据记录中均按其原始顺序排列。
我们可以简单地检查一下。前三行十六进制的第一个值(即文件反转前的最后三行)与我们之前记录的值匹配:93、E7 和 B8,顺序为 93、E7 和 B8。
对于终端窗口单行来说,这是一个相当大的技巧。
一切都有目的
在 Linux 世界中,即使是看似最简单的命令和实用程序也可能具有令人惊讶的强大特性。
简单的实用程序只做一件事并且很容易与其他实用程序交互的设计理念已经产生了一些奇怪的小命令,例如 tac
。乍一看,它似乎有点奇怪。但是,当您窥视表面之下时,您会发现一种意想不到的力量,您可以利用它来发挥自己的优势。
或者,正如另一种哲学所说,“不要因为蛇没有角而鄙视它,因为谁说它不会变成龙呢?”
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts