Linux cat命令完全指南:从文件查看到拼接与管道实战 如果你在Linux服务器上待过哪怕一天几乎不可能没碰过cat命令。它是整个系统里最基础、最不起眼的工具之一很多新手第一次查看文件内容敲的就是cat xxx。但有意思的是大多数人用cat也就停留在看文件这一步它真正的价值——文件拼接、内容创建、配合管道做流式处理——反而很少被认真发掘。这篇文章我想从一个长期折腾服务器的老用户角度把这几年在cat命令上踩过的坑、总结出的用法、以及那些文档里不会写的细节一次性整理出来。适合刚接触Linux的入门者也想给每天要和文本文件打交道的运维、开发同学做个参考。1. 先弄明白cat命令的本职从名字理解功能边界1.1 cat的全称是concatenate不是看文件很多教程一上来就说cat用于查看文件这个说法不能说错但特别容易让人误解。cat这个名字来自concatenate意思是连接、拼接。最初设计这个命令的目的是把多个文件的内容串联起来然后输出到标准输出。查看单个文件只是它最简单的用法之一。理解这个背景后面很多所谓的高级操作就不难理解了。比如你想把三个日志文件按顺序拼成一个完整日志最直接的写法就是cat access_1.log access_2.log access_3.log access_all.log这就是cat最原始、最核心的用法。它把所有参数指定的文件一个接一个地读出来再写到标准输出。标准输出默认是屏幕所以你看文件内容但它可以被重定向到文件、被管道传给下一个命令、甚至通过命令替换赋给变量。cat本身不做任何格式化它做的事情本质上就是把字节流原封不动地读出来。这是一个非常朴素的工具但正因为朴素它非常可靠在脚本和自动化里你可以放心依赖它。从这个角度理解cat你就能分清它和less、more、tail这类命令的本质区别less是为了交互式查看而设计支持翻页、搜索、跳转而cat是一次性吐出来没有交互的概念。cat适合处理小文件、适合在脚本里自动读取、适合拼接但不适合在终端上翻阅大文件。把这个定位想清楚你就不会在错误场景里埋怨它难用了。1.2 cat命令最高频的五个使用场景我在日常服务器操作中cat命令主要出现在五个场景里每一个都是绕不开的存在。第一快速查看小文件内容。比如一个配置文件、一个刚生成的结果文件内容就几十行直接cat一眼扫完根本不需要进入交互模式。这是最高频的用法也是最容易被人忽略原来它是拼接命令的原因。第二在脚本里读取文件内容做进一步处理。比如用命令替换把文件内容赋给变量config$(cat /etc/xxx.conf)这比打开编辑器手动复制高效太多而且是脚本化的、可重复的。第三文件拼接与合并。把多个分片文件合成一个完整文件或者把多个配置片段拼进同一个文件这是cat的看家本领也是它区别于查看命令的核心功能。第四配合重定向快速创建文件或追加内容。在没有图形界面的服务器上想快速写一个临时脚本或配置文件cat xxx然后粘贴内容比打开编辑器再进入插入模式要直接得多。第五配合管道做流式处理。cat把文件内容灌给grep、sed、awk、wc这些命令形成一条处理链。虽然有些场景可以用输入重定向替代这种写法但cat在很多脚本里依然是表达最清晰的方式。把这五个场景刻在脑子里后面所有参数和实操练习都会有明确的目的学完也不会忘。2. 参数逐个拆解这些选项每个都能派上用场cat的官方参数不算多但每一个都有明确的实用价值。我把最常用的几个挑出来逐个演示并说明它和类似命令之间的区别。2.1 显示行号-n与-b空行处理是关键差别最常见的需求是查看文件顺便看下行号。cat -n会给所有行编号包括空行而cat -b只给非空行编号空行编号为空。假设有一个文件test.txt内容如下hello world执行cat -n test.txt输出1 hello 2 3 world执行cat -b test.txt输出1 hello 2 world实际使用中我更倾向于cat -b因为它输出的行号是有效内容行号。你要把某一行内容发给同事定位问题用-b得到的编号不会因为空行产生偏差。但如果你需要精确对应文件物理行的位置比如分析格式严格的数据文件那就用-n。这里有个容易误会的点cat -n显示的行号是它自己算出来的不会修改原文件。很多人第一次会以为加了参数就把文件改了其实cat的输出永远只是写到标准输出对源文件没有影响。想让文件真正带上行号需要配合重定向或者用nl命令另存。2.2 压缩连续空行-s让文件看起来清爽很多有些配置文件、日志文件里有大量连续空行直接cat会看到一坨空白特别影响阅读。加s参数后cat会把连续两个以上的空行压缩为一个空行文件整体结构一目了然。实际场景某服务的日志经常出现多个连续空行排查问题时我想快速看出内容结构直接cat -s app.log比肉眼数空行舒服多了。注意它只是把输出中的连续空行压缩了文件本身没动空行还是原样存在。这一点和sed的压缩逻辑不同cat -s只影响展示层不改变数据。2.3 把隐藏字符打回原形-A、-E、-T、-v这是导致很多人翻车、也让一些人显得很专业的一组参数。默认情况下你看到文本内容里行尾的换行符、Tab制表符和其他不可见控制字符都是不被显示的但有些场景你必须知道它们长什么样。-E会在每行行尾显示一个$符号用来确认换行符是否存在、行尾有没有多余空格。-T会把Tab制表符显示为^I这样就能区分空格和Tab缩进。-A相当于-vET合起来把所有非显示字符都展示出来这也是我最常用的排错参数。比如检查一个从Windows传到Linux的脚本文件它的行尾是\r\n直接cat看不出任何问题但执行cat -A file会看到每行末尾出现^M$立刻明白是CRLF换行符的问题。这种场景在脚本里如果遇到sed、awk行为诡异第一反应就应该是用cat -A看一眼文件原貌能省下大量排查时间。-v参数则是显示不可见字符的通用开关会把除了换行、Tab之外的控制字符显示成^X或M-x的形式。看到这些符号出现说明文件里可能有控制字符或二进制内容混进了文本需要警惕。2.4 参数组合使用一次检查多个维度cat的参数可以自由组合比如cat -ns file表示显示行号且压缩空行cat -AE file表示显示隐藏字符且行尾加$。组合参数能在一个命令里完成多项检查排查效率非常高。我举个实际例子。假设一个文件里有几行文本、几个多余空行、行尾还有空格你直接cat根本看不出异常。但执行cat -nE file之后空行编号和行尾空格都会被暴露出来甚至能数出每行到底多了几个空格。给团队做代码规范检查的时候这种肉眼diff工具虽然不是万能的但在没有更多静态检查工具的服务器上它就是最轻量、最可靠的靠山。3. 实战五类高频用法每条都能直接抄作业下面这五类用法都是我在真实服务器上反复用过的。每个都给出可直接执行的命令并解释为什么要这样写。3.1 快速创建文件cat配合重定向写入在没有图形界面的终端环境想快速创建一个文件直接输入cat myconfig.conf回车后进入输入状态你输入的所有内容都会写入文件按CtrlD结束输入文件就保存了。如果文件已存在这个操作会覆盖原内容如果只想追加内容用两个大于号cat myconfig.conf追加模式下不会破坏已有内容新输入的内容接在文件末尾。第一次用的人容易把和搞混我的记忆方法是像一把刀会把原来的内容切掉重新写像两把刀并排是在后面继续切也就是追加。这个记忆法虽然有点朴素但确实管用。3.2 多文件合并cat真正的看家本领合并多个文本文件是cat最原始的功能。假设有三个分片文件part1.txt、part2.txt、part3.txt想合成一个完整文件cat part1.txt part2.txt part3.txt merged.txt顺序严格按照命令行参数的顺序排列这在做备份合并、日志合并、配置片段拼接时极其常用。还有一种写法是用通配符cat part*.txt merged.txt这里的稳定要打个引号因为shell默认按字典序展开通配符。如果你的分片是part1、part2、part10字典序可能是part1、part10、part2合并结果就和预期不一样了。这种情况下我会把参数显式罗列或者给分片补零命名比如part01、part02从源头避免顺序问题。别小看这个细节日志分片合并时顺序错了后续分析就全废了。3.3 用cat配合heredoc写多行内容在脚本或终端里一次性写入多行内容最便捷的方式就是heredoccat app.conf EOF server { listen 80; server_name example.com; } EOF这段命令把两个EOF之间的内容原样写入app.conf。EOF可以替换成任意字符串但用EOF是社区惯例。这比一条一条echo追加高效得多也便于维护多行模板。heredoc有个细节值得注意定界符加不加引号行为完全不同。EOF表示中间内容不做任何变量展开、不做命令替换适合写配置模板、SQL脚本防止内容里的$被意外替换。而EOF不加引号则会先做变量展开比如你写入的内容里有$HOME它会先替换成实际路径再写入。我一般默认加引号除非确实需要变量展开否则宁可不冒险。3.4 用cat当搬运工管道配合下游命令cat最常见的管道用法是把文件内容传给下一个命令。比如统计日志文件里404错误出现的次数cat access.log | grep 404 | wc -l这个写法的优点是逻辑清晰读起来一行命令就是一条完整的数据流cat把内容拿出来grep做筛选wc做统计。不过这里有个被讨论很多的问题cat file | grep xxx和grep xxx file哪个更好技术上后者少一个进程、少一次管道传输性能更好而且grep本身支持直接读文件。社区里管cat file |这种写法叫UUOCUseless Use of Cat无用cat。我个人的习惯是脚本里追求效率时直接用grep xxx file但在交互式终端或者需要把多个文件都传给下游命令时cat的写法更直观、不容易漏文件。两种写法都掌握根据场景选不用被绝对禁止的说法束缚。3.5 查看文件并编号调试时的打印利器调试脚本或者阅读较长配置时我喜欢用cat -b file输出带有效行号的内容同时配合管道做局部筛查。比如只想看第20到30行cat -b file | sed -n 20,30p虽然sed本身就能完成切片任务但加上编号后输出里能直接看到行号方便和grep、编辑器里的行号对应。这种组合使用是小命令协作的典型例子也是Linux哲学里Do one thing and do it well的体现。4. 避坑指南这些情况尽量别用cat否则容易翻车cat很好用但很多场景并不适合它。下面这些坑我基本都踩过写出来帮你们绕开。4.1 大文件别直接cat刷屏和资源消耗都是问题拿cat读取一个几百MB的日志文件终端会瞬间被内容淹没而且整个屏幕不停滚动你想看前面几行根本来不及。更麻烦的是如果文件真的很大cat会把全部内容读出来输出网络连接场景下会占用大量带宽和终端缓冲区严重时终端直接卡死。正确做法是大文件用less/more交互式查看或者配合head/tail只看首尾head -n 50 app.log tail -n 50 app.log如果确实要看中间某一段用sed切片sed -n 2000,2100p app.log我的经验是超过几百行、且有翻阅需求的文件直接选less。cat适合的是我确定要看全部内容并且内容不会太多的场景比如看配置文件、看脚本头部说明。把这个判断标准刻在脑子里能避免很多尴尬。4.2 误读二进制文件乱码、终端状态被搞乱cat读取二进制文件会发生什么终端会尝试把二进制字节解释成字符于是屏幕上出现一堆乱码符号。更麻烦的是有些控制字符会改变终端状态比如调整颜色、光标位置甚至切换字符集严重时你会以为终端坏了。这并不是系统出了问题只是终端收到了不该显示的内容。处理办法不要用cat查看二进制文件需要看时用hexdump、xxd、od这类专门工具。万一误cat了二进制文件导致终端显示混乱执行reset或stty sane恢复终端状态。在脚本里如果无法确定文件是不是纯文本先file xxx看一下类型再做决定。我曾在生产环境误cat了一个二进制文件的片段整屏乱码不说后续在这个终端窗口敲命令都出现奇怪字符最后靠reset才恢复。从那以后我就养成了file先行的习惯先看类型再动手这句话在排查未知文件时真的很重要。4.3 文件名以-开头参数解析的经典陷阱文件名以-开头会让cat误认为是参数。比如有个文件名是-help.txt直接cat -help.txt会报错因为它把-help.txt当成选项解析了。解决办法是加--分隔符cat -- -help.txt这个--告诉cat后面的内容都是文件名不要再解析选项。这个问题在rm、mv等命令里同样常见是命令行工具的通用约定。虽然实际命名中很少遇到这种文件名但写脚本时如果文件名来自外部输入一定要考虑这种情况防止被shell或命令的参数解析坑到。4.4 cat /dev/null清空文件好用但有前提如果你不小心cat /tmp这种目录路径系统会提示是一个目录然后退出。这里想重点说的是另一种情况cat读取/dev/null配合重定向来清空文件这是老运维常用手法cat /dev/null access.log这条命令能把日志文件清空但保留文件本身的权限和所有权比rm再touch更干净也不会因为删除了文件导致正在写日志的进程出问题。但这里有个前提必须说清楚清空线上正在被进程持续写入的日志文件时有些程序的文件句柄会继续往旧位置写文件大小可能不降反涨。这种情况下更稳妥的方式是用truncate -s 0 access.log。实际操作前先确认程序行为不要盲目套用。5. 排查经验与技巧速查把cat用得又快又稳5.1 常见问题速查表我把平时最容易遇到的情形和处理方式整理成了一张表方便直接对照场景现象推荐处理查看小文件内容直接输出全文cat 文件名查看大文件刷屏无法定位用less/tail/sed切片不要cat全文给内容编号需要定位行号cat -n含空行或cat -b忽略空行压缩连续空行空行太多影响阅读cat -s 文件名检查行尾或Tab怀疑有隐藏字符cat -A 文件名合并多个文件拼接顺序输出cat 文件1 文件2 合并文件快速创建文件终端内写内容cat 文件名CtrlD结束追加内容不覆盖已有内容cat 文件名文件原本是Windows格式行尾有^Msed -i s/\r$// 文件名或直接用dos2unix文件名以-开头被误认为选项cat -- -文件名误读了二进制文件终端乱码执行reset恢复终端这张表按场景、现象、处理三个维度整理基本覆盖了我这些年见过的cat相关问题。遇到问题先查表定位排查时间能省下一大半。5.2 几个实用技巧把cat用出仪式感第一个技巧是掌握tac命令。tac是cat反过来拼功能是倒序输出文件内容。比如查看日志时想先看最近发生的记录如果日志是按时间正序追加的tac app.log | head -n 50能直接看到最后50行。它和tail -n 50的结果方向不同在某些脚本场景里比如从后往前匹配内容tac反而更顺手。第二个技巧是把多个文件一起查看让每个文件带上小标题。直接cat a.txt b.txt时文件之间没有分隔输出混在一起很难分清哪段来自哪个文件。我常用一个简单循环for f in conf/*.conf; do echo $f ; cat $f; done一行命令把所有配置文件按顺序展示每个文件前面有醒目分隔线排查配置问题时非常直观。这个习惯我保持了多年每次看多文件内容都用这招。第三个技巧是cat配合命令替换在脚本里读取配置。比如version$(cat /etc/app_version)把文件内容直接赋给变量比用read循环读文件简单得多。如果文件有多行命令替换会保留换行符需要注意按需去掉首尾空白。这个技巧在写运维脚本时出现频率极高。第四个技巧是养成cat只读不写的警觉意识。任何cat ... 的写法一旦回车目标文件立刻被覆盖没有编辑器那样的撤销机制。我建议在重要文件上用重定向之前先确认目标路径正确或者先用cat ... 新文件生成副本检查无误后再mv替换原文件。线上操作尤其要养成这个习惯一次手滑可能就得花半天恢复现场。第五个技巧是在写自用脚本时用heredoc输出帮助信息。很多时候脚本需要给使用者一段说明直接用cat EOF输出帮助文本既不需要额外的文档文件也不会被变量展开干扰脚本整体还能保持简洁。这个模式我几乎在所有生产脚本里都用非常顺手。5.3 从cat出发值得顺带掌握的几个兄弟命令cat虽然简单但它所在的位置是Linux基础命令的枢纽节点。和它配合最紧密的几个命令建议一起掌握tac反向输出cat的倒序版本。head/tail读取文件头部/尾部适合大文件定向查看。less交互式翻页查看弥补cat不能翻页的短板。nl专门给文件加行号的命令功能和cat -b类似但选项更丰富。paste把多个文件按列合并和cat按行合并形成互补。join按关键字合并两个文件适合结构化数据处理。这几个命令放在一起学能把文件内容处理这个主题一次打通。cat负责最基础的行级输出其他命令各管一个方向组合起来就是一套完整的内容查看与处理工具箱。我个人在实际操作中最受益的一个习惯是任何cat结果不对的时候不急着怀疑系统先检查三件事——文件是不是文本用file命令、行尾是什么用cat -A、文件有没有被其他进程改动用ls -l和md5sum对比。排查完这三个大部分诡异问题都能落地。cat本身没有太多高阶技巧它的价值恰恰在于基础、稳定、可以放心依赖。希望这篇整理能帮你把cat从会敲升级到用得明白在Linux系统里多一份从容。