1. 为什么“查看与编辑”值得单独讲1.1 从一个报错现场说起信不信你接触Linux服务器之后最常敲的往往不是那些花哨的系统管理命令而是文件内容查看与编辑这一组最基础的命令。线上服务出问题第一反应是看日志要调整配置第一件事是打开配置文件确认当前值要确认进程是不是在跑、磁盘是不是满了最终都要落到从某个文件里取数据。我自己带的团队里新人入职第一天我就给他们定了一条规矩把文件内容类命令练熟比先把那些复杂脚本背下来更重要。原因很简单排查问题的速度往往就取决于你“看文件”和“改文件”的效率。这篇是“Linux常用命令”系列的第二篇主题聚焦在文件内容查看与编辑。大概会涉及head、tail、lessgrep、sed、awk还有vim这一套命令组合。它们分工不同组合起来才是完整的操作流先定位范围再过滤关键行然后做修改或统计最后用编辑器精调。把这套组合吃透日常运维和开发是真能省下大把时间的这比你去翻几十页命令大全有用得多。1.2 先建立一张心智地图我习惯把文件内容类操作拆成两个维度查看和编辑。查看维度解决的是“文件里到底有什么”包括内容太长怎么看只看前几行或最后几行怎么办只想看包含某个关键词的行这就对应cat、head、tail、less和grep。编辑维度解决的是“怎么改”包括临时调整几个字符串、批量替换、按规则重写部分行、打开文件交互式修改这就是sed、awk和vim的舞台。很多初学者容易走两个极端一是全靠vim打开文件硬看文件几十万行时又慢又卡二是什么都用cat输出看一半终端就被刷屏了。建立心智地图的意义在于看到命令能立刻判断它属于哪个维度、适合什么数据量。比如同样是看日志几十行的配置文件用cat没问题几百MB的日志文件就要用less需要筛选就交给grep需要统计就交给awk。后面所有命令我都会放到这个框架里解释这样就不容易乱。2. 查看文件内容先学会正确地“看”2.1 cat、tac、nl小文件场景的三板斧cat可能是很多人学会的第一条文件查看命令。它把整个文件内容直接输出到终端适合小文件比如查看一个简单的配置文件或README。我经常配合两个参数用cat -n file会在每行前打印行号排查时说到“第几行有问题”就很方便cat -s能把连续多个空行压缩成一个查看那种格式混乱的配置时特别有用不然几行空行混在一起人眼很容易看错层级。tac是cat倒过来拼功能正好相反从最后一行开始往前输出。你别小看它后面讲日志排查时会用到。比如要看错误日志里最新一条发生的上下文从头读到尾效率太低tac app.log | head -n 100能快速拿到文件靠后的内容相当于用“倒序截断”解决了大文件尾部查看问题。nl给文件加上行号输出效果类似cat -n但它对空行的处理更灵活默认不编号空行加-b a可以给所有行编号。日常我用nl的场景不如cat -n多但脚本里处理带行号输出时它更规范输出的格式也更可控。需要注意三板斧都只适合小文件。文件上G之后直接cat会把终端刷到卡死而且没有任何检索能力你根本来不及找自己要看的东西。这类场景要交给后面的less去解决。2.2 head、tail只要开头或结尾head默认输出文件前10行tail默认输出最后10行。这是个极其常用的组合看配置通常只看头部注释和主要段落所以head -n 20 /etc/nginx/nginx.conf很快就够用看日志则几乎只用tail因为新的日志不断追加在文件末尾从头看没有任何意义。tail -f是日志跟踪的神器没有之一。它会持续输出新追加的内容相当于挂在了文件尾部。部署服务时我基本都会开一个终端执行tail -f app.log然后去触发操作实时看有没有报错。用CtrlC退出。如果日志更新太快刷屏可以再加管道过滤比如tail -f app.log | grep ERROR只盯着错误看这是排查线上问题时最高频的组合之一。head和tail还可以组合读中间某段head -n 100 file | tail -n 20先取前100行再取这100行的后20行就拿到了第81到100行。这个方法虽然能用但更优雅的方案是用sed指定行号范围这个后面会讲到。2.3 less大文件浏览的正确姿势less是查看大文件的首选。它不会一次性把整个文件读进内存而是按需加载所以即使文件有几个G打开也很快不会像cat那样把内存和终端一起拖垮。很多发行版还默认把man手册的翻页器设成less可见它的可靠程度。进入less后空格键向下翻一屏b向上翻一屏j/k逐行移动gg跳到文件开头G跳到结尾/关键词回车可以搜索匹配项n跳到下一个匹配位置。看完按q退出。这套按键记熟之后我几乎没用过别的工具翻大日志。需要注意less打开文件本身不会阻塞其他操作你随时可以退出但如果你用less查看一个正在被写入的日志可以用ShiftF进入类似tail -f的跟随模式实时看到新内容CtrlC切回普通浏览。对比一下moremore是老一代的翻页工具功能少只能向下翻不支持向上回看所以现在基本被less取代了。问到“more和less怎么选”我的答案永远是less没有犹豫的必要。2.4 wc顺手统计文件规模wc用来统计文本规模常用三个参数wc -l统计行数wc -w统计单词数wc -c统计字节数。对日志排查看行数增长非常有用比如每隔一分钟wc -l app.log对比行数变化就能粗略判断错误是否在持续产生。结合crontab还能做一个简单的日志量监控脚本比如行数在短时间内暴增大概率是服务在刷错误这时候脚本里记一个告警提前发现问题这些都是很实用的思路。3. grep把符合条件的行“捞”出来3.1 先理解管道grep最强大的用法是跟在管道后面。管道符|的含义是把左边命令的输出当作右边命令的输入。你可以理解成一条传送带A机器生产的货物直接滑到B机器的处理环节中间不落地。刚开始我很难理解为什么tail -f app.log | grep ERROR能一直过滤。其实管道传递的是文本流tail持续往管道里吐新的内容行grep从管道里取一行就判断一行留下包含ERROR的行打印出来。整个链路是实时联动的一边持续输出一边持续过滤这才是命令行组合的常态。不带管道的时候grep单独也能用grep 关键字 文件名直接在文件里搜索。两种方式都很重要具体场景里选顺手的。不过日常使用中我发现自己超过一半的grep都在管道后面因为日志和配置往往要经过多级处理才能得到最终结果。3.2 高频率使用的参数清单直接上我平时最高频的一组grep参数-i忽略大小写。搜error时顺便把Error、ERROR都命中排查时不漏报。-n显示匹配行所在的行号回填问题报告时直接写“第几行”同事能快速定位。-v反向匹配留下不包含关键字的行。配合排错很好用比如排除debug行。-c只统计匹配行数不输出明细。判断“这种错误出现了多少次”时一步到位。-E启用扩展正则可以用更丰富的匹配语法。-r递归搜索目录直接对一个目录树做全量搜索grep -rn TODO src/是代码审计的经典用法。另外强烈建议在shell配置里加一句alias grepgrep --colorauto让匹配到的关键字在终端里高亮显示找东西的效率会提升一个档次。很多发行版默认已经配好了但有些精简环境没有手动加一行绝对值得。3.3 正则的实战用法grep支持基础正则和扩展正则配合-E或者直接用egrep等价就能用上、|、()等语法。举两个我实际用过的场景场景一从nginx访问日志里筛出所有POST请求。grep -E POST access.log如果只想看来源IP再配合awk取字段这跟后面讲awk是联动的。场景二排除注释行看配置。grep -vE ^#|^$ /etc/nginx/nginx.conf直接把注释和空行全部过滤掉剩下的就是实际生效的配置主体一眼就能看清全局。排查“配置到底改没改生效”时我先执行这一条比打开文件来回翻快得多。正则里^表示行首$表示行尾.表示任意字符*表示前一个字符重复任意次。这些基础符号配合-E能解决绝大多数搜索需求真到复杂需求就去查man grep不用全背。4. sed不进入编辑器就能改文件4.1 理解sed的工作方式sed是流编辑器处理逻辑可以理解为一条传送带文件内容一行一行被读入经过一条规则流水线处理后输出。它不像vim那样打开整个文件的编辑界面而是按规则批量执行所以特别适合脚本化、自动化的批量修改。比如要给一百台服务器的配置文件统一改一个端口一条sed命令就够你不可能手动开vim去重复一百次。sed最核心的结构是“寻址动作”。寻址决定“处理哪几行”动作决定“怎么处理”。比如sed -n 5,10p file其中5,10是寻址表示第5行到第10行p是动作表示打印不加-n的话sed会默认打印所有行再叠加p会重复打印所以单独用p时基本都要配-n。初学sed容易犯的错是忘记加-n结果打印出两遍内容以为是命令写错了。其实原理很简单sed默认对每一行都执行“打印”操作这是它的默认行为如果你又在规则里指定打印那就是打印两次。记住这个机制就不会再困惑。4.2 三个高频动作打印、删除、替换打印动作p配合-n已经说过了适合取文件的某一段sed -n 20,50p app.log直接看日志第20行到50行比head/tail组合清晰得多。删除动作d用于按规则删行sed 3d file删除第3行sed /^#/d file删除所有以#开头的注释行sed $d file删除最后一行。注意sed默认不修改原始文件只是把处理后的结果输出到终端真正落地要配合-i参数或者重定向。这个“默认不改原文件”的特性其实是新手最需要感谢的设计可以放心大胆地试规则。替换动作s是sed使用率最高的功能语法是s/原内容/新内容/。sed s/localhost/192.168.1.10/g config.conf会把所有localhost替换成目标地址最后的g表示全局替换不加的话一行只替换第一个匹配到的。这个命令是我改环境配置时的常客一条命令解决所有环境的地址批量替换比用编辑器挨个找省太多时间。4.3 修改文件和备份的好习惯sed真正修改文件用的是-i参数比如sed -i s/8080/9090/g server.conf。但我强烈建议每次-i都带上备份后缀sed -i.bak s/8080/9090/g server.conf这样操作前会自动生成一个server.conf.bak备份文件。万一替换规则写错了cp回来就能恢复。血的教训我之前在线上批量替换配置正则写漏了一个转义结果把一批文件里不该动的内容全替换了。因为提前留了.bak最后一条命令批量恢复才没造成更大的事故。所以“先备份再批量改”这条规矩请务必当成铁律。尤其在线上环境一条命令多按一个回车可能就是一场事故。sed里还有两个高级符号值得掌握在替换内容中用表示“正则匹配到的整个字符串”比如sed s/http:/https:\/\// url.txt会在http:后面补上匹配到的字符串用分组()和\1表示捕获组比如把“2026-01-01”换成“2026/01/01”可以写成sed -E s/([0-9]{4})-([0-9]{2})-[0-9]{2}/\1\/\2/ dates.txt。这种写法在做日志时间格式统一、批量重命名时非常香。5. awk字段级处理和统计5.1 认识awk的字段模型awk和sed最大的区别在于sed以行为单位处理awk以字段为单位处理。awk读入一行后会自动按分隔符把行切分成多个字段$0代表整行$1代表第一个字段$2代表第二个字段依次类推。默认分隔符是空白字符空格或Tab想自定义就用-F指定awk -F: {print $1} /etc/passwd会把passwd文件按冒号切开打印出每个用户的名字这是awk最经典的开场示例。我第一次理解awk的字段模型时突然就明白为什么运维爱用awk看日志了nginx的access.log每行都有“客户端IP 时间 请求URL 状态码 响应字节数”这些信息用awk {print $1, $9}就能把IP和状态码两列单独抽出来。这比对着整行去找快太多了尤其是访问量大的日志人工找一屏能累死awk一秒钟就给你提出来了。5.2 条件过滤与BEGIN/ENDawk的完整结构是awk BEGIN{预处理} 条件{动作} END{收尾}。BEGIN在读取第一行之前执行适合初始化变量或打印表头END在所有行处理完后执行适合输出汇总结果中间的“条件{动作}”是核心逻辑没有条件就是每行都执行动作。举个例子看系统中uid大于1000的普通用户可以用awk -F: $31000 {print $1, $3} /etc/passwd。$3是uid字段条件是uid大于1000满足条件的行才会打印用户名和uid。这个“条件动作”模型上手之后能处理的问题范围非常大几乎任何“只要符合条件的数据”都能用awk筛出来。NR是awk内置的行号变量表示当前处理的是第几行。想“跳过表头再统计”可以用NR1这个条件。NF是当前行的字段数打印每行的最后一个字段用$NF在处理字段数不固定的文本时特别实用。比如有些日志行格式不统一尾巴上还带多余内容用$NF永远能取到最后一个有效字段。5.3 统计实战状态码分布与慢请求定位awk的统计能力是它区别于其他命令的核心价值。我用一个非常常见的需求演示统计nginx访问日志里各状态码的出现次数。命令是awk {count[$9]} END {for (code in count) print code, count[code]} access.log不要被这段吓到拆开看count[$9]的意思是拿第9个字段状态码当数组下标每遇到一次就加1END块里用for循环遍历这个数组把每个状态码和它的次数打出来。如果要按次数排序再管道接sort -rn即可。整条命令跑完等于给日志做了一次“自动分类汇总”人工统计能折腾一下午awk一秒出结果。另一个刚需场景是找慢请求假设请求耗时是第11个字段awk $11 1 {print $1, $4, $11} access.log就能把耗时超过1秒的请求的客户端IP、时间和耗时都筛出来进一步定位性能瓶颈。我排查线上接口变慢时第一板斧就是它先把“慢”都筛出来就知道该重点看哪些请求了。6. vim终端里最常用的编辑器6.1 三种模式先搞明白vim之所以让新手劝退大多卡在模式上。其实理解三条模式就够了普通模式是默认模式在这里所有按键都是命令比如j下移、x删除字符、d删除行不直接输入文本按i进入插入模式这时键盘才真正用于输入内容按Esc回到普通模式按冒号进入命令模式用于执行:q退出、:w保存这类指令。我让新同事做过的对比实验在普通模式下敲wq不小心按成qw结果文件没保存就退出。模式搞不清楚之前任何保存类命令最好输入前确认一下当前处于什么模式按Esc多按几次不亏。等肌肉记忆形成之后你会发现vim的移动效率其实是所有编辑器里最高的双手不离开主键盘就能完成一切操作。6.2 高频操作清单vim里值得优先记的按键就两桌一桌是移动和跳转一桌是编辑和搜索。移动gg跳到文件首行G跳到末行数字G跳到指定行w按单词向后跳b按单词向前跳0跳到行首$跳到行尾。熟练之后定位到“第200行的中间某个单词”只是几秒钟的事比鼠标滚动找半天快得多。编辑i在光标前插入a在光标后插入o在下一行新开一行插入yy复制整行p粘贴dd剪切整行想删几行就写数字dd如5dd删除5行u撤销Ctrlr重做x删除光标处字符。搜索/关键字回车从头往下搜索n跳到下一个匹配N回退到上一个如果想反向搜索可以用?。这套组合记下来vim日常编辑已经够用了。我看到很多教程让新手把几十个快捷键全背下来没必要用到哪儿学到哪儿最自然等真正需要高频操作再去扩展。6.3 批量替换与多窗口vim的替换和sed的风格很像只是范围写法不同。最常用的三个:s/old/new/替换当前行的第一个匹配:s/old/new/g替换当前行所有匹配:%s/old/new/g替换整个文件所有匹配%代表全文件范围。如果不想一股脑替换在命令最后加c即:%s/old/new/gc每次替换前都会问你确认。线上改配置时这个交互确认能救命防止一个正则把不该动的地方全改掉。多窗口用:split上下分屏:vsplit左右分屏Ctrlw加方向键在窗口间跳转。同时看两个文件或同一个文件的不同位置时效率极高我最常用的场景是左边打开配置模板右边打开目标配置一边对照一边改不会出现改错行的情况。6.4 一个够用的~/.vimrcvim默认裸奔状态体验一般我建议至少把这几行写进~/.vimrcset number syntax on set tabstop4 set autoindent set encodingutf-8 set pasteset number显示行号syntax on打开语法高亮set tabstop4把缩进宽度设为4格set autoindent自动缩进set encodingutf-8避免中文乱码set paste在粘贴时不做自动缩进避免粘一大段代码进来格式全乱。这套配置没有多余插件但能把vim从“能编辑”变成“好用”。至于插件管理、主题美化等你实际需要了再研究初期别被配置折腾耗尽热情。7. 实战复盘一次线上日志排查与配置修改的完整流程7.1 定位现场tail加grep讲个很典型的场景早上收到告警说订单服务接口超时率上升登上服务器第一步就是看日志。我先tail -f /var/log/app.log | grep ERROR把实时错误刷出来确认确实有报错后用CtrlC停掉跟随再tail -n 500 /var/log/app.log | grep ERROR看最近500行里的错误明细判断大概在什么模块抛的。这一步的关键是别一上来就grep全部文件几十个G的日志grep一遍要等半天。先tail一个窗口看到错误再逐步扩大范围效率和成功率都更高。很多人一着急就grep -r ERROR /var/log整个目录扫数据量大时纯属浪费时间。7.2 提炼数据awk统计错误分布看到一堆错误后下一步不是逐条读而是统计。我把错误日志按“错误码或异常类型”分组计数找出最高频的报错再把触发的源IP筛出来。一次典型操作是grep ERROR app.log | awk {print $5} | sort | uniq -c | sort -rn | head -20这条管道把grep筛出的错误行交给awk取第5列异常类型字段sort排序后uniq -c去重并计数再sort -rn按次数倒序最后head -20取前20个。一次性拿到Top20错误类型及次数谁是主要矛盾一目了然。拿到分布后思路就清晰了不是排查全部错误而是集中火力解决占比最高的那一个根因。这个习惯我从菜鸟时期一直用到今天排查效率提升非常明显真正做到了“先看数据再动手”。7.3 修改配置sed批量改加vim精调定位到根因后要调整应用配置改的是nginx里一处超时时间参数还有另一个地方的worker数量。我先把配置文件复制一份备份cp nginx.conf nginx.conf.bak然后用sed批量替换超时时间sed -i s/client_header_timeout 10s/client_header_timeout 30s/ nginx.conf再改用vim打开原文件检查其他上下文打开后先/搜索相关路径跳到对应位置用%s//gc确认的替换方式逐步精调。所有改动结束后别急着加载配置一定要先验证语法nginx -t通过后再nginx -s reload。这条流程备份、批量替换、人工复查、语法校验、平滑加载就是我改任何线上配置的标准动作稳到几乎没有出过事。配置文件这种东西一旦改错影响的是整台服务的运行多一步检查永远值得。8. 常见问题与避坑清单8.1 高频问题速查表现象原因解决方式cat大文件后终端卡死整个文件刷屏内存和终端都扛不住改用less或先用head/tail控制范围grep搜不到结果正则里的特殊符号被shell解释用单引号把模式包起来如grep ^#.*sed -i改完发现改错了没有备份无法回退养成-i.bak习惯操作前cp备份日志文件里有大量^M符号文件来自Windows行尾带了\r用dos2unix file或sed -i s/\r$// filevim打开中文是乱码编码设置不符合文件编码vimrc里设置set encodingutf-8 fileencodingsutf-8权限不足无法读文件当前用户没有对应权限先sudo cat或用sudo -i排查完及时退出8.2 几条实战心得第一命令永远不要靠死记硬背。我教团队时的口号是“知道有什么工具比记住每个参数更重要”。你只需要知道less能看大文件、grep能过滤、sed能批量替换、awk能统计、vim能交互编辑具体参数用的时候man一下用多了自然就刻在脑子里了。第二所有批量修改类操作无论sed还是vim改之前先想一步“改错了怎么办”。备份是成本最低的后悔药尤其是生产环境宁可多敲一条cp命令也别赌自己的正则百分百无误。第三这套命令组合不是孤立存在的实际工作里几乎总是连着用。grep筛完交给awk统计awk取完列再管道sort排序中间再配uniq去重这才是Linux命令行的真正魅力所在。慢慢你会发现所谓“高手”不过是把管道用得更溜罢了。最后分享一个我自己的小习惯只要排查过一遍环境问题我就会把当天用到的核心命令粘贴到一个自己维护的“命令速查”文件里分类存放。下次遇到同类问题直接翻自己的笔记比去搜索引擎重新翻结果快得多。这个系列文章其实也是这种整理习惯的产物希望能帮你少走点弯路。