tac 是什么?
tac 是一个用于处理文本文件的命令,它的功能非常直观:将文件的行按顺序颠倒过来显示。

你可以把它理解为 cat 命令的“反向版本”。cat 是 concatenate(连接)的缩写,而 tac 则是 cat 的字母顺序反转。
tac 的工作原理
tac 读取文件时,不是从第一行开始读到最后一行,而是从最后一行开始,逐行向上读取,直到第一行,然后将结果输出到标准输出(通常是你的终端)。
示例:
假设有一个文件 fruits.txt如下:
apple banana cherry date
使用 cat 命令查看:

$ cat fruits.txt apple banana cherry date
使用 tac 命令查看:
$ tac fruits.txt date cherry banana apple
可以看到,行的顺序完全颠倒了。
常用选项
tac 命令的选项虽然不多,但非常实用。
-b 或 --before
将分隔符显示在它所分隔的内容之前。

这是 tac 的一个核心特性,因为它需要处理多行记录,默认情况下,tac 认为换行符 \n 是分隔符,但有时我们可能希望将多行作为一个整体来反转。
示例:
假设有一个日志文件 server.log如下:
[INFO] Server started on port 8080
[WARN] Low memory warning
[ERROR] Connection failed to database
直接使用 tac:
$ tac server.log [ERROR] Connection failed to database [WARN] Low memory warning [INFO] Server started on port 8080
这看起来和 cat -r(如果存在的话)一样,我们使用 -b 选项,并指定一个自定义的分隔符,]。
$ tac -b ']' server.log [INFO] Server started on port 8080 [WARN] Low memory warning [ERROR] Connection failed to database
发生了什么?
tac 会把 ] 当作分隔符,它会找到最后一个 ],然后从那里开始,将 ] 及其之后的内容作为一个块,向上查找前一个 ],以此类推,这些块的顺序被颠倒了。
更常见的多行记录示例:
一个邮件文件,每封邮件由 From_ 开头。
From: alice@example.com
To: bob@example.com
Subject: Hello
Hello Bob!
From: charlie@example.com
To: david@example.com
Subject: Meeting
Hi David, let's meet at 3pm.
我们想按邮件的逆序显示:
$ tac -b 'From_' mail.txt From: charlie@example.com To: david@example.com Subject: Meeting Hi David, let's meet at 3pm. From: alice@example.com To: bob@example.com Subject: Hello Hello Bob!
这样,最后一封邮件就显示在了最前面。
-r 或 --regex
将分隔符解释为正则表达式,这使得分隔符的功能变得更加强大和灵活。
示例: 假设我们有一个文件,每条记录由 分隔,并且记录本身也包含 。
Record 1, part A
---
Record 1, part B
---
Record 2, part A
---
Record 2, part B
如果我们直接用 作为分隔符:
$ tac -b '---' records.txt Record 2, part B --- Record 2, part A --- Record 1, part B --- Record 1, part A
这并不理想,因为 tac 在字符串匹配上可能会产生混淆。
使用 -r 选项,我们可以用正则表达式 \n---\n 来精确匹配作为分隔符的独立行:
$ tac -rb '\n---\n' records.txt Record 2, part B Record 2, part A --- Record 1, part B Record 1, part A
这次,tac 只将那些独立成行的 视为分隔符,从而正确地反转了记录块。
tac vs. cat -r
你可能会想,cat 命令不是有一个 -r 或 --reverse 选项可以反向输出行吗?
$ cat -r fruits.txt date cherry banana apple
是的,在大多数现代的 Linux 发行版(如 Ubuntu, CentOS 7+ 等)中,cat -r 或 cat --reverse 可以实现和 tac 相同的基本功能。
为什么还要保留 tac 命令?
- 兼容性:在一些较老的 Unix 系统或特定的
cat实现中,可能没有-r选项。tac是一个标准的 POSIX 命令,兼容性更好。 - 多功能性:
tac的核心优势在于-b和-r选项,这使得它能够处理更复杂的、基于自定义分隔符的多行记录的反转,这是cat -r无法做到的。 - 语义清晰:
tac这个名字本身就明确表达了“反向显示文件内容”的意图,代码可读性更高。
实际应用场景
tac 在一些特定的脚本任务中非常有用:
-
查看最新日志:当你只想查看日志文件的最后几行时,
tail是首选,但如果你想对整个日志文件进行某种基于行的逆序处理,tac就派上用场了。# 假设一个日志文件,每条日志以时间戳开头,想按时间逆序处理 tac -b '2025-' app.log | grep "ERROR"
-
处理多行记录:如前面提到的邮件、配置块等,需要将记录作为一个整体进行反转时,
tac是不二之选。 -
快速反转列表:如果你有一个简单的列表文件,需要快速反转顺序。
# user_list.txt 内容是用户列表,需要反转 tac user_list.txt > reversed_users.txt
| 特性 | 描述 |
|---|---|
| 全称 | tac (cat 的反写) |
| 功能 | 将文件的行按逆序输出。 |
| 基本用法 | tac filename |
| 核心选项 | |
-b, --before |
在分隔符之前显示分隔符,用于处理多行记录。 |
-r, --regex |
将分隔符解释为正则表达式,提供更强大的匹配能力。 |
与 cat -r 的区别 |
cat -r 是较新实现,功能相对单一;tac 是标准命令,功能更全面,尤其在处理多行记录时更强大。 |
| 适用场景 | 日志处理、多行记录反转、列表逆序等。 |
tac cat 的“反向”版本,并且当你需要用非换行符作为分隔符来反转多行内容时,tac 是你的最佳工具。
