Linux cat 命令入门

Linux cat 和 zcat 命令比您可能意识到的更有用。
209 位读者喜欢这篇文章。
Unleashed: Open source tech for pets and animals

Jeff Macharyas, CC BY-SA 4.0。唐纳德,这只猫。

Cat 是一个相当简单的工具,旨在将文件连接并写入到您的屏幕,这被称为标准输出 (stdout)。它是 GNU Core Utils 的一部分,根据 GPLv3+ 许可证发布。您可以期望在几乎任何 Linux 发行版或其他 Unix 操作系统环境(如 FreeBSD 或 Solaris)中找到它。cat 最简单的用法是显示文件的内容。这是一个名为 hello.world 的文件示例

$ ls
hello.world
$ cat hello.world
Hello World!

$

我使用 cat 命令最常见的方式是查看配置文件,例如 /etc 目录中的文件。cat 命令将显示文件,而不会有损坏文件的风险。如果我使用 Vi 或 Nano 等编辑器打开关键配置文件,我可能会无意中对文件进行不必要的更改。cat 命令不是编辑器,因此不会对文件内容造成更改的风险。

如果我需要查看更长的文件,我可以将管道与 more 命令结合使用

$ cat <somelongfile> | more

Cat 可以同时显示多个文件。如果我们想查看两个文件——hello.worldgoodbye.world——我们将在命令中包含这两个文件名作为参数

$ cat hello.world goodbye.world
Hello World!

Good Bye World!

$

Cat 还可以在输出期间为文件行编号。有两个命令可以执行此操作,如帮助文档所示

-b, --number-nonblank    number nonempty output lines, overrides -n
-n, --number             number all output lines

如果我对 hello.world 文件使用 -b 命令,则输出将像这样编号

$ cat -b hello.world
     1	Hello World!

$

在上面的示例中,有一个空行。我们可以通过使用 -n 参数来确定此空行出现的原因

$ cat -n hello.world
     1	Hello World!
     2
$

现在我们看到有一个额外的空行。这两个参数作用于最终输出,而不是文件内容,因此如果我们对两个文件都使用 -n 选项,则编号将按如下方式计数行

$ cat -n hello.world goodbye.world
     1	Hello World!
     2	
     3	Good Bye World!
     4
$

另一个可能有用的选项是 -s,表示squeeze-blank。此参数告诉 cat 将重复的空行输出减少为一行。这在查看有很多空行的文件时很有帮助,因为它有效地在屏幕上容纳更多文本。假设我有一个文件,其中三行被几个空行隔开,例如本示例 greetings.world

$ cat greetings.world
Greetings World!




Take me to your Leader!




We Come in Peace!
$

使用 -s 选项可以节省屏幕空间

$ cat -s greetings.world
Greetings World!

Take me to your Leader!

We Come in Peace!
$

Cat 通常用于将一个文件的内容复制到另一个文件。您可能会问,“为什么不直接使用 cp?” 这是我如何创建一个名为 both.files 的新文件,其中包含 hellogoodbye 文件的内容

$ cat hello.world goodbye.world > both.files
$ cat both.files
Hello World!

Good Bye World!

$

zcat

cat 命令还有另一个变体,称为 zcat。此命令能够显示已使用 Gzip 压缩的文件,而无需使用 gunzip 命令解压缩文件。顺便说一句,这也节省了磁盘空间,这正是文件被压缩的全部原因!

zcat 命令更令人兴奋,因为对于花费大量时间查看系统日志文件的系统管理员来说,它可以节省大量时间。我们在哪里可以找到压缩的日志文件?查看大多数 Linux 系统上的 /var/log。在我的系统上,/var/log 包含多个文件,例如 syslog.2.gzsyslog.3.gz。这些文件是日志管理系统的结果,该系统轮换和压缩日志文件以节省磁盘空间并防止日志增长到无法管理的文件大小。如果没有 zcat,我将不得不先使用 gunzip 命令解压缩这些文件,然后才能查看它们。值得庆幸的是,我可以使用 zcat

$ cd /var/log
$ ls *.gz
syslog.2.gz  syslog.3.gz
$
$ zcat syslog.2.gz |more
Jan 30 00:02:26 workstation systemd[1850]: Starting GNOME Terminal Server...
Jan 30 00:02:26 workstation dbus-daemon[1920]: [session uid=2112 pid=1920] Successful
ly activated service 'org.gnome.Terminal'
Jan 30 00:02:26 workstation systemd[1850]: Started GNOME Terminal Server.
Jan 30 00:02:26 workstation org.gnome.Terminal.desktop[2059]: # watch_fast: "/org/gno
me/terminal/legacy/" (establishing: 0, active: 0)
Jan 30 00:02:26 workstation org.gnome.Terminal.desktop[2059]: # unwatch_fast: "/org/g
nome/terminal/legacy/" (active: 0, establishing: 1)
Jan 30 00:02:26 workstation org.gnome.Terminal.desktop[2059]: # watch_established: "/
org/gnome/terminal/legacy/" (establishing: 0)
--More--

如果我们想不间断地查看这两个文件,我们也可以将这两个文件传递给 zcat。由于日志轮换的工作方式,您需要以相反的顺序传递文件名,以保留日志内容的时间顺序

$ ls -l *.gz
-rw-r----- 1 syslog adm  196383 Jan 31 00:00 syslog.2.gz
-rw-r----- 1 syslog adm 1137176 Jan 30 00:00 syslog.3.gz
$ zcat syslog.3.gz syslog.2.gz |more

cat 命令看起来很简单,但非常有用。我经常使用它。您也不需要像对待真正的猫一样喂养或爱抚它。与往常一样,我建议您查看 catzcat 命令的手册页 (man cat),以了解有关如何使用它的更多信息。您也可以使用 --help 参数来快速了解命令行参数的概要。

标签
Alan Formy-Duval Opensource.com Correspondent
Alan 拥有 20 年的 IT 经验,主要在政府和金融部门。他最初是一名增值经销商,之后转行从事系统工程。Alan 的背景是高可用性集群应用程序。他撰写了 Oracle Press/McGraw Hill 出版的《Oracle Solaris 11 系统管理》一书中的“用户和组”和“Apache 和 Web 堆栈”章节。

6 条评论

有趣的文章,现在我知道了一些新东西“zcat”。总有东西要学习。感谢分享。

还有 “tac” 命令,它只是一个倒过来的 “cat”!
按照你的例子
~~~~~
tac both.files

Good Bye World!

Hello World!
~~~~
Happy hacking! :)

感谢分享。

有趣的文章,但请不要滥用 cat 通过管道传输到 more......

我正在尝试教人们少用管道,而你却在这里滥用 cat 通过管道传输到其他命令。恕我直言,99.9% 的情况下这是不必要的!

大多数时候,与其使用 “cat file | command”,不如使用 “command file”(是的,我是一个老古董,来自内存非常昂贵的时代,fork 多个命令可能会耗尽所有内存)

cat 也可用于在没有编辑器的情况下创建(或附加到)文本文件

$ cat >> foo << "EOF"
> Hello World
> Another Line
> EOF
$

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.