cat 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
cat——文件与目录命令族(见文件与目录命令族)最基础的命令。它名字来自 concatenate(连接),但 90% 场景被用来"看文件"。
cat(concatenate,连接)把一个或多个文件的内容连起来输出到屏幕/管道。它既能看小文件,也能拼接多个文件。但要记住一句老话:cat 适合小文件,大文件请用 less——否则刷屏。
一、基本用法
cat file # 输出整个文件内容
cat a.txt b.txt # 拼接多个文件依次输出
cat a.txt b.txt > c.txt # 合并到新文件(重定向)
cat > new.txt # 从键盘输入、Ctrl-D 结束(创建小文件)
cat a.txt b.txt > c.txt是合并文件的经典写法(注意>会覆盖,追加用>>)。cat > file从 stdin 直接写文件,适合快速建小文本(但多行编辑还是用编辑器)。拼接是 cat 的本名来源——"连接"才是它的正职。
二、编号与显示:-n / -b / -A
cat -n file # 所有行加行号(含空行)
cat -b file # 仅非空行加行号
cat -A file # 显示不可见字符(行尾 $、tab ^I)
-n/-b加行号,排查"第几行出错"时配合报错信息有用。-A显示不可见字符是定位"诡异格式"的神器:行尾的^M(Windows 换行\r)、tab 被当成空格的迷惑——cat -A一眼现形。处理跨平台文本(CRLF vs LF)必用。
三、cat 的误区:别用它看大文件
cat huge.log # 灾难:整个文件刷屏,终端卡死
less huge.log # 正确:分页看,可滚可搜
head -n 50 huge.log # 只看开头(见 [head](/linux/cmd/head.md))这是新手最容易犯的错:想"看看文件"就
cat,结果几 G 的日志直接灌爆终端。cat会一次性全输出,没有分页。看大文件用 less(可上下翻、搜索/)、或 head/tail 看局部。cat 的正确定位是"把内容喂给管道下游",不是给人逐屏读。
四、管道里的 cat(无谓用法)
cat file | grep "error" # 反模式:多起一个 cat 进程
grep "error" file # 更好:grep 直接读文件
cat file | while read line; do ...; done # 这倒是合理(逐行处理)"Useless use of cat" 是圈内梗:很多
cat file | cmd里 cat 纯属多余,cmd file直接读更高效。但cat file | while read这种需要逐行处理的,cat 是合理的。原则是:能直接传文件名给下游的,就别绕一道 cat。
五、变体:tac / zcat / bat
tac file # 倒序输出(cat 反过来)
zcat file.gz # 直接看 gzip 压缩文件内容(不解压)
bat file # bat:带语法高亮的现代 cat(见 [现代工具](/linux/modern-tools))tac 是 cat 倒过来(从末尾往前),偶尔看日志倒序用。
zcat直接读压缩文件内容,配合管道分析压缩日志很方便。现代有bat(语法高亮版 cat),本地阅读体验更好,但脚本里还是用 cat 保兼容。
六、实战:合并与清洗
# 合并多个分片日志
cat part-*.log > all.log
# 看文件是否有 Windows 换行
cat -A file | head # 行尾出现 ^M$ 即 CRLF
# 去 Windows 换行(见 [sed](/linux/cmd/sed.md))
sed -i 's/\r$//' file第一条是合并日志分片的常规动作。第二、三条展示
cat -A发现 CRLF 问题、再用 sed 清除——跨平台协作时 Windows 编辑器产生的\r常让 shell 脚本在 Linux 上跑挂,cat -A是第一步诊断。
一句话总结
cat = 连接并输出文件内容:本职是拼接(cat a b > c),也常看小文件;-n/-b 加行号、-A 显不可见字符(揪 CRLF/tab);大文件别 cat(刷屏),用 less/head/tail;避免"无用 cat"(能直接读文件的命令就别绕一道)。变体 tac 倒序、zcat 读压缩、bat 高亮。