cat 是什么
cat 的职责是把文件内容按顺序写到标准输出(concatenate),因此它同时承担三件事:查看小文件、把多个文件拼成一个流、以及配合重定向与 heredoc 创建文件。它不是一个查看器——没有分页、没有搜索、没有行号高亮,把几十兆的日志交给它只会刷屏。超过一屏的内容应改用 less,只有在脚本里需要内容本身而不是给人看时才用 cat。
基本信息
| 适用平台 | Linux、macOS、BSD(GNU coreutils / BSD cat) |
|---|---|
| 命令语法 | cat [选项] [文件...];不给文件则从标准输入读取 |
| 常用选项 | -n 为所有行编号、-b 只对非空行编号、-s 把连续空行压缩为一行、-E 在行尾显示 $、-T 把制表符显示为 ^I、-A 等价于 -vET(显示不可见字符) |
| 权限要求 | 读取文件需要该文件的读权限,以及路径上各级目录的执行权限 |
| 典型组合 | 重定向 > 覆盖写入、>> 追加、heredoc 就地生成文件、管道交给后续命令处理 |
典型使用场景
- 查看小文件:几十行以内的配置或脚本直接输出,比打开编辑器快
- 拼接文件:把多个分片按顺序合成一个文件,例如合并日志片段
- 生成文件:用 heredoc 快速写配置文件或脚本片段,避免反复打开编辑器
- 检查不可见字符:用 -A 确认行尾是 LF 还是 CRLF、制表符与空格是否混用
- 管道预处理:把内容送入 grep、awk 或排序命令处理
- 对齐行号:-n 输出行号,便于与报错信息里的行号对应
常用示例
常用示例
cat app.conf
cat -n app.conf # 所有行加行号
cat -A app.conf # 显示制表符(^I)与行尾($)
cat -s access.log | head # 压缩连续空行
cat file1 file2 > merged.txt
cat > note.txt <<'EOF'
hello $USER
EOF
sudo tee /etc/app/app.conf > /dev/null <<'EOF'
port = 8080
EOF
cat /dev/null > big.log # 清空文件但保留 inode相关写法对照
| 写法 | 作用 | 注意 |
|---|---|---|
| > 文件 | 覆盖写入,原有内容立即丢失 | 确认目标后再执行 |
| >> 文件 | 追加写入 | 常见于日志与汇总场景 |
| <<'EOF' | heredoc,带引号时不做变量与命令展开 | 模板里想保留 $VAR 就用引号 |
| <<EOF | heredoc,不带引号时会展开变量与命令替换 | 想写入当前用户名等实际值时不加引号 |
| cat -A | 显示全部不可见字符 | 排查 CRLF 与制表符混用 |
| tee | 写入文件同时输出到终端 | 需要 root 权限写文件时配合 sudo 使用 |
cat 拼接多个文件不会插入任何分隔符,多段内容首尾相接,阅读时容易混淆边界。需要标记时用 sed 或 awk 在每段前插入文件名与时间戳,或改用 for 循环逐文件处理。另外要分清工具职责:实时变化用 tail -f,分页与搜索用 less,统计行数用 wc -l,把 cat 当作它们的替代品是常见误用。
需要 root 权限写文件时,sudo cat > file 不生效——重定向由当前 shell 完成,提权没有覆盖到重定向。正确写法是 sudo tee file,或 sudo sh -c 'cat > file';清空日志类文件可以用 : > file。
不要用 cat 读二进制文件:控制字符会打乱终端显示,严重时终端状态错乱需要执行 reset 恢复。先 file 文件名 判断类型,查看二进制用 xxd、hexdump 或 less 更安全。
cat 在处理「参数以短横线开头」与「空文件」时有细节:文件名以 - 开头要写成 cat -- -文件 或 ./文件;读空文件不会有输出也不报错,脚本里判断文件是否为空应改用 test -s 文件,而不是看 cat 有没有输出。
与相关命令的分工
| 命令 | 作用 | 适用 |
|---|---|---|
| nl | 加行号且可自定义宽度与分隔符 | 生成对外的带行号清单 |
| tac | 按行反向输出 | 查看最近写入的尾部记录 |
| rev | 反转每行字符顺序 | 配合 cut 取行尾字段 |
| wc -l | 统计行数 | 只想计数时不必先拼接 |
| tee | 同时写文件与标准输出 | 需要提权写入时 |
想知道文件有多少行用 wc -l,不必绕 cat -n 再取最后一行;需要固定行号宽度、自定义分隔符,或用空格补齐时改用 nl,它还能选择是否给空行编号,比 cat -n 更适合生成给人看的清单。