文本处理77 条

tac 倒序输出行

按行倒序打印文件:日志从最新往回看、倒查变更记录时很顺手;-s 可指定行分隔符。

Linux 运维命令速查系统更新于 2026-10-13

tac 做什么

tac 按行倒序输出文件,相当于把 cat 反过来读:从最新往回看日志、倒查变更记录时比 tail 更直接 —— tail 只给尾部若干行,tac 能把整份文件的顺序翻转后从头看。用 -s 可以自定义分隔符,把按记录分块的文件(例如以 --- 分隔的多行记录)整块倒序,这在处理非行式文本时很有用。

基本信息

适用平台Linux 与类 Unix(GNU coreutils)
语法tac [选项] 文件...(不加文件则读标准输入)
常用选项-s 指定分隔符、-r 分隔符按正则解释、-b 分隔符附着在前一条记录之后
默认行为按换行分块,整读文件后倒序输出
相关命令tail -n、sort -r、less +F

典型使用场景

  • 日志从最新往回看(tac app.log | head -20)
  • 多行记录文件整块倒序(每条记录以 --- 之类的分隔符结束)
  • 一批候选结果从最后一条往前处理
  • 比对配置时从尾部开始定位差异出现的分界
  • 演示或教学时直观展示“文件被反向读取”

常用示例

常用示例
tac app.log | head -20             # 最新日志置顶(与 tail -20 的顺序相反)
tac -s '---' record.txt            # 按自定义分隔符整块倒序
tac -s '---' -r record.txt         # 分隔符按正则解释,可匹配变长分隔符
tac -b -s '---' record.txt         # 分隔符附着在前一条记录之后,输出位置不同
ls /var/log/*.log | tac            # 列表本身也能倒序,先看最近生成的文件
tac app.log | head -5 | cut -c1-80 # 倒序后再截取,快速看最近几条的关键信息

选项读法

选项作用注意
默认(无选项)按换行切成块再倒序输出就是最常见的“行倒序”
-s 分隔符把分隔符当作块边界处理多行记录文件的关键选项
-r分隔符按正则解释支持变长分隔符,例如匹配多连字符
-b分隔符附着在前一条记录之后分隔符位置变化会影响解析脚本
与 sort -r 的区别tac 翻转顺序,sort -r 按字典序倒排两者语义不同,别互相替代
tac 需要先把文件读进来处理:内存与耗时随文件大小增长。只想看尾部若干行时 tail 更合适,超大日志不要用 tac 硬扛。
最后一行没有换行符时,输出与直觉略有差异(缺失的尾换行会体现在第一条输出里)。做严格内容比对时先确认原文件的换行情况。

易错点

  • 用 tac 处理几十 GB 的日志:整读带来的内存与 I/O 压力明显,改用 tail 或按窗口抽取
  • 把 tac 当成 sort -r 用:前者翻转文件顺序,后者按字典序排序,需求不同会得到错误结果
  • 自定义分隔符时忽略 -b/-r 的语义:块边界与预期不一致,后续解析全错位
  • 把 tac 放进长管道的中间:整读会破坏流式处理,必须等前序命令全部结束才开始输出

数据来源与参考

  • man 1 tac(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌