ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Linux vi编辑器全攻略:从基础操作到高级实战技巧

Linux vi编辑器全攻略:从基础操作到高级实战技巧 1. 为什么vi是Linux绕不过去的编辑器先说个我自己的经历。早些年接手一台跑着老版本CentOS的服务器SSH登上去准备改个nginx配置下意识敲了vim系统直接提示command not found。再试nano、emacs全都没有。最后发现系统里唯一躺着的编辑器就是vi而且没装任何额外软件包的环境根本不允许我随便yum install。那一刻我意识到vi不是一个可选的编辑器而是Linux系统的保底技能。这个场景放到今天依然成立。无论是Docker容器里精简到极致的镜像、嵌入式开发板上的BusyBox环境还是刚装完的最小化Linux系统vi几乎是唯一被预装的文本编辑器。所以它既是面试题里的常客也是生产环境里最后一道兜底。网上经常有人争论vi该不该学、都用IDE了为什么还要用vi我的观点很直接你可以不用vi写代码但你不能保证每台机器上都有你习惯的工具。把vi练熟最大的价值在于它不依赖图形界面、不依赖网络、不依赖额外的软件包只要有一个终端、一个SSH连接就能完成几乎所有文本编辑工作。这篇文章我把vi从打开文件到批量编辑、从基本操作到配置优化的完整脉络捋一遍尽量用实际操作的写法来讲而不是堆命令列表。适合刚接触Linux的新手也适合已经会用但一直没系统梳理过vi操作的老手。2. vi与vim的区别以及三种模式2.1 vi和vim到底是什么关系很多新手会困惑vi和vim到底是不是同一个东西简单说vim是vi的增强版全称是Vi IMproved。vim在vi的基础上增加了语法高亮、多级撤销、分屏、插件扩展这些现代功能而vi本身是几十年前UNIX时代就存在的经典编辑器。vim的启动命令里往往有个vi的软链接所以你在终端里敲vi实际打开的可能是vim。这也是为什么很多人觉得vi也能显示颜色其实那是vim在后台工作。判断当前用的到底是vi还是vim看两个地方输入:version看看输出内容或者看编辑器底部的版本提示。如果是纯粹的vi命令模式下输入一些vim专属命令时会报错。日常学习中建议直接把vi和vim当成同一套操作体系来练所有vi能用的按键操作vim全部兼容。反过来vim多出来的高级功能在实际服务器操作中反而是加分项。2.2 三种模式的切换是vi的精髓vi和普通编辑器最大的不同是它有模式。Windows记事本也好、macOS的TextEdit也罢你打开就能直接打字vi不行。vi有三种基础模式理解它们vi就理解了80%。命令模式Normal mode打开vi后默认进入的模式。这个模式下所有按键都是命令比如j是向下移动、x是删除当前字符、dd是删除整行。插入模式Insert mode在这个模式下才能像普通编辑器一样输入文字。从命令模式按i进入。底行模式Last line mode也叫命令行的扩展模式按:进入用于保存退出、查找替换、设置参数等下指令操作。初学者最容易犯的错误是不知道当前处于什么模式直接乱敲键盘。比如在命令模式下想输入数字屏幕上却跳来跳去或者按了i进入插入模式后以为还在命令模式想保存文件结果把:当字符输入了。记住一个口诀按完命令先看一眼左下角显示INSERT说明在插入模式空白的说明在命令模式。三种模式切换的关系可以这么记打开vi默认是命令模式按a或i进入插入模式按Esc或者CtrlC退回命令模式在命令模式按:进入底行模式执行完底行命令后自动回到命令模式。3. 核心操作实录从打开文件到保存退出3.1 打开文件的方式与场景选择打开一个文件最简单的方式就是vi 文件名。但实际工作中会面对各种具体情况# 打开现有文件光标定位到第一行 vi /etc/nginx/nginx.conf # 打开文件并定位到第50行 vi 50 /var/log/messages # 打开文件并定位到包含error的第一个匹配处 vi /error /var/log/messages # 文件不存在时vi会创建新文件保存后才有名字 vi newfile.txt # 以只读方式打开防止手滑 vi -R important.txt第2个和第3个参数特别实用。排查日志文件时日志动辄几千行打开后光标直接停在指定的行或关键字上能省不少上下翻找的时间。我曾经排查一个应用启动失败的日志就用vi /ERROR app.log直接跳到报错位置效率比一条条翻高得多。3.2 光标移动别再用方向键了新手阶段用方向键移动光标完全没问题但熟练以后一定要养成用hjkl的习惯。原因是方向键离字母区远手要离开主键盘区效率低而且有些精简环境或者SSH终端对方向键支持不好。hjkl四个键的对应关系h向左、j向下、k向上、l向右。进阶一点的移动命令更实用w向后跳一个单词b向前跳一个单词0跳到行首$跳到行尾gg跳到文件第一行G跳到文件最后一行CtrlF向下翻一页CtrlB向上翻一页CtrlD向下翻半页CtrlU向上翻半页H跳到屏幕顶部M跳到屏幕中间L跳到屏幕底部这里说一下我的实操心得在日志里定位问题用/关键词搜索比手动翻页快得多。vi里的搜索在命令模式下直接输入/加上要搜的内容回车后按n继续向后找按N向前找。搜索支持正则表达式比如/^ERROR能匹配每行开头的ERROR字样/ERROR.*timeout能匹配包含ERROR和timeout的行。3.3 插入文本i、a、o的区别进入插入模式的方式不止i一种不同场景下用不同按键能减少后续的光标移动操作。i当前光标所在字符前面插入最常用a当前光标所在字符后面插入I跳到当前行的行首插入A跳到当前行的行尾插入这个非常常用比如在配置文件的某行末尾加分号o在下方新建一行并进入插入模式O在上方新建一行并进入插入模式写一个实际例子改nginx配置时想把listen 80;改成listen 8080;光标移到80后面按r替换或者按x删掉再按i插入用A直接跳行尾追加反而绕路了。而如果要在某个块下面追加一行配置用o最顺手。这些选择本质上是减少光标移动次数练得越熟日常改配置的节奏感就越强。3.4 删除、复制、粘贴与撤销vi里的删除和复制不是通过鼠标而是通过命令组合。这里的核心概念是操作对象按什么键作用于哪个范围。x删除光标所在字符相当于Windows记事本里的Delete键X删除光标前面的字符相当于退格键dd删除光标所在整行5dd删除从当前行开始的5行dw删除一个单词d$从光标位置删除到行尾d0从光标位置删除到行首yy复制光标所在行5yy复制从当前行开始的5行y$从光标位置复制到行尾p粘贴到当前行下方复制的是整行时P粘贴到当前行上方撤销和恢复同样重要u撤销上一步操作CtrlR恢复刚才撤销的操作。注意u和CtrlR是一对逆操作如果撤销撤多了用CtrlR找回来。vi默认只支持一级撤销旧的vi但vim支持多级撤销这也是vim比vi好用的地方之一。还有一个命令容易被忽略J把当前行和下一行合并成一行处理换行混乱的文件时很有用。3.5 保存退出的正确姿势保存退出是vi里最常见的操作也是最容易出问题的操作。底行模式下几个关键命令:w保存文件不退出:q退出没有修改时:q!不保存修改强制退出:wq保存并退出:x保存并退出与:wq等价但:x只在有修改时才写入文件ZZ命令模式下保存并退出注意这个没有冒号:w 新文件名另存为:wq!强制保存并退出文件只读时用重点讲讲权限问题。有时候你打开一个系统配置文件改了保存时报E212: Cant open file for writing这就是当前用户没有写权限。两个处理方式用sudo vi重新打开文件或者在vi里用:w !sudo tee %这个经典技巧——它通过shell命令把当前buffer内容写回文件。这个命令我实际用过的场景不小心用普通用户打开了/etc/hosts改完才发现没权限保存又不想退出重来就用它救场。不过提醒一句生产环境改系统配置前最好先备份任意编辑器操作都有手误的风险。4. 批量操作查找替换与多文件处理4.1 查找替换的完整语法工作中很多配置文件的批量修改比如把所有http://改成https://手动一条条改效率太低必须用vi的替换命令。替换命令的基本格式是:范围 s/查找内容/替换内容/标志范围常用的几种写法%s表示全文件%是每一行的意思5,10s表示第5行到第10行.,10s表示从当前行到下面10行.,$s表示从当前行到文件末尾标志部分g替换该行所有匹配而不是每行只替第一个——这个必须加不加的话每行只替换第一个匹配容易漏c每次替换前询问确认安全操作推荐加i忽略大小写实际示例# 全文件把所有old替换成new每行所有匹配都替换 :%s/old/new/g # 全文件把所有old替换成new每条都要确认 :%s/old/new/gc # 只替换第10到20行 :10,20s/old/new/g # 忽略大小写替换 :%s/old/new/gic标志的交互很多人第一次见会比较懵执行后会逐个显示匹配位置问replace with new? (y/n/a/q/l/e)。y替换n跳过a全部替换剩余q退出l替换本次并退出e等价于q但报错信息不同。我的建议是改动量大、规则又没那么明确时先用gc试运行一遍看几个实际上下文再决定是否全量替换。我以前改数据库连接串时就吃过亏配置文件里有注释和实际生效两处都含旧地址用g直接全部替换注释里也被改了虽然不影响运行但给后来排查的人造成了困惑。4.2 多文件编辑与切换vi打开多个文件的方式vi file1.txt file2.txt file3.txt:n切换到下一个文件:N或:prev切换到上一个文件。:files列出所有打开的文件每行前面有%的表示当前文件有#的表示上一个文件。:e 文件名可以在不退出vi的情况下打开另一个文件到当前buffer。用vim还能分屏操作:sp水平分屏:vsp垂直分屏CtrlW加方向键在分屏间跳转。调试配置文件对比时这个功能很好用左边放原文件右边放要改的文件边看边改。不过分屏功能要求vim老系统中的纯vi不支持用之前先确认环境里是vi还是vim。多文件编辑我对新手的建议是先别深入知道有这功能即可。真正经常用到的是vi /etc/nginx/nginx.conf然后配合nginx -t测试语法而不是在vi里开一堆文件来回切换。4.3 寄存器和宏重复操作的加速器vi有个寄存器的概念可以用ayy把当前行复制到a寄存器而不是默认的匿名寄存器然后用ap把它粘贴出来。这个有什么用比如你需要在不同地方多次粘贴不同的内容块默认粘贴会覆盖上一次的内容寄存器可以同时存多份互不干扰。更强大的是宏录制。命令模式下按q再按一个字母比如a开始把后续所有操作录制到a寄存器再按q停止。之后想重复这套操作在命令模式下按a执行一次重复执行上一次宏命令。宏让我最惊艳的一次是批量格式化一个几百行的配置文件手动完成一行中删除多余空格→移动字段位置→在行尾加逗号三步操作录成宏然后用99a一次性处理完剩余行。前提是每行结构一致否则宏会跑飞操作前最好找几行做测试。5. 配置与优化让vi更像一个现代编辑器5.1 临时配置与配置文件vi的核心逻辑是默认保守、按需开启。在底行模式可以临时设置比如:set nu显示行号:set nonu取消:set list显示不可见字符比如行尾的$、Tab的^I检查混入空格还是Tab时很有用:set expandtab让Tab键展开成空格Python用户强烈建议开:set ts4 sw4设置Tab宽度为4空格:set hlsearch高亮搜索匹配结果:set incsearch边输入边搜索这些设置如果每次都要手动敲太烦了所以要把它们写进vi的配置文件/etc/vimrc系统级或者~/.vimrc用户级。新建~/.vimrc写入这几行基本不会出错set nu 显示行号 set expandtab Tab键转空格 set ts4 Tab宽度4 set sw4 缩进宽度4 set hlsearch 搜索高亮 set incsearch 增量搜索 set cursorline 高亮当前行 syntax on 语法高亮配置文件生效方式是重启vi或者底行执行:so ~/.vimrc重新加载。不写set compatible是因为vi和vim的配置默认就不同保持vim默认行为即可。5.2 编码问题与乱码处理服务器上编辑文件经常会遇到中文乱码——文件是用UTF-8还是GBK编码会影响vi的显示。vi底行模式执行:set fileencoding可以查看当前文件编码。如果是乱码先试:set encodingutf-8再:set fileencodingutf-8然后:w保存。如果文件本身是GBK试:set fileencodinggbk。实在不行用iconv命令转换编码iconv -f gbk -t utf-8 oldfile.txt newfile.txt从经验来说Linux环境下产生的文件基本是UTF-8乱码多半是文件从Windows传过来的Windows老系统默认GBK或者终端编码设置不对。vi本身能正确识别UTF-8但终端如果设置成别的字符集显示照样乱。这种情况先排查LANG环境变量和SSH客户端的字符集再怪vi不迟。5.3 恢复意外中断未保存的文件vi有个特性常被忽略它会在编辑时创建一个临时交换文件文件名是文件名.swp。如果编辑过程中SSH断线、终端被强杀vi会保留这个swap文件再次打开原文件时会提示Swap file xxx.swp already exists并提供恢复选项。遇到这种情况按RRecover即可恢复上次未保存的内容恢复后记得删除swap文件。这个功能我救过命有次在服务器上改一个很长的配置脚本改到一半公司断电所有终端都断开了当时没保存心态崩溃。重新连接后发现swap文件还在恢复后内容几乎都在只少了最后几行。重要文件编辑到关键节点按一下:w不算浪费一两秒的代价远小于从头再来。vim -r 文件名也能查看有没有可恢复的版本。清理swap文件的命令是rm 文件名.swp但谨慎操作确认不需要恢复再删删了就真没了。6. 进阶技巧块操作、标签页与远程文件6.1 块选模式批量处理多行内容和列编辑vi里有个叫可视块的功能其他编辑器里叫列模式快捷键是CtrlV。进入后按方向键选出一个矩形区域可以对这个区域统一操作。典型的场景多行行首统一加注释光标移到第一行行首CtrlV向下选到最后一个目标行按ShiftI输入#再按Esc所有选中的行首都会插上#。多行统一删除选中几行的行首字符按d批量删掉。多行替换选中区域后输入:s/old/new/g在选中的多行内做替换。这个功能在处理配置文件的批量注释时效率极高。比如nginx里临时屏蔽一组server块或者批量给几十行日志分析脚本加注释块操作比一行行改快太多了。注意块选模式下ShiftI插入的内容会在按Esc后生效这是很多人卡住的地方插入了半天没反应急得猛按键盘其实是没按Esc确认。6.2 标签页多个文件的分组管理现代vim和部分vi发行版支持标签页类似浏览器的标签。:tabnew 文件名在新标签打开文件:tabnext切到下一个标签:tabprev切到上一个:tabclose关闭当前标签。这个功能适合在多个相关文件中切换比如同时改应用的前后端代码、或者对比MySQL配置和服务日志。不过标签页是vim特性纯vi环境没有优先级排在块操作之后。实际项目中我更常用分屏而不是标签页:vsp左右分屏左屏打开配置文件右屏打开日志文件边改边看报错:sp上下分屏适合上面是文件头注释、下面是正文的场景。分屏比标签页好在两个文件同时可见不用来回切换对照效率更高。6.3 在vi中直接执行Shell命令vi的底行模式可以透出shell命令用!前缀。这个功能使用频率不算高但关键时刻能省很多事。:!ls在vi里执行ls并显示结果按回车回到vi:%!sort把当前文件所有行用sort命令排序后放回文件:%!grep -v ^#把不包含注释的行过滤回文件。比较实用的是配合tee类命令做权限补救前面提过的:w !sudo tee %就是例子。还有一些系统管理场景在vi里直接跑:%!python3 -m json.tool对JSON格式进行格式化和纠正不用退出编辑器到命令行去操作。底行模式的!是把当前文件内容作为标准输入传给外部命令注意是整行替换的语义不理解的先在小文件上试一次再用于真实文件。7. 常见问题与排查技巧实录7.1 方向键和退格键不好使新装的Linux、或者某些终端模拟器下vi特别是纯vi对于方向键的映射不完善按方向键会输出A、B、C、D或者出现^[[A之类的字符。这其实就是终端和编辑器对键盘序列的解析不匹配。处理方式一是用hjkl代替方向键这在vi里最稳二是检查终端类型echo $TERM如果显示的是dumb之类的vi很多按键功能都会异常试着把终端类型设置成xterm-256color或xterm三是退格键不好使时可以在vi的配置文件里加set backspaceindent,eol,start这个配置项的作用是允许退格键删除缩进、行尾、以及之前插入的内容默认设置为空的时候退格键在某些模式下最多只能删到插入点给用户一种退格键没反应的错觉。7.2 文件总是显示只读vi编辑文件时提示只读先确认文件权限ls -l 文件名。如果权限确实是644当前用户无写权限用sudo vi重新打开如果权限没问题考虑是不是设了immutable属性lsattr 文件名如果显示i属性需要用chattr -i解除这属于高级场景一般出现在安全加固过的系统上。还有一层可能文件本身在一个只读挂载的分区上用mount | grep 路径查看。注意一点如果文件有写权限vi是允许编辑只读文件的只是保存时提示确认vi的只读是广义的。如果你只是在vim里按了Ctrl-X Ctrl-Q之类的组合进入了某种只读模式按Esc退出再试试普通编辑就行。7.3 大文件编辑卡顿与性能优化日志文件动不动几百MB甚至GB级别直接用vi打开会非常卡甚至卡死。我的经验是# 只查看文件尾部几百行 tail -n 200 /var/log/syslog # 按关键字过滤 grep error large.log | vi - # 如果只需要修改先split split -l 10000 large.log # 用sed流编辑 sed -i s/old/new/g large.logvi适合编辑配置文件这类中小文本不适合当大日志浏览器。如果需要精确查看大文件的部分区域:e配合地址定位比如:e 50000 large.log可以跳到第5万行但这只是应急办法。真正处理大文件应该用less浏览、grep过滤、sed批量替换vi只在需要精准编辑时登场。7.4 误操作求救从死循环到意外退出新手在vi里最常遇到的事故是不知道把自己弄到了什么状态屏幕上的字还在跳。这里给一套紧急脱险流程按多次Esc无论什么模式先回命令模式这个操作无副作用放心按。CtrlC同样可以中断当前操作并回到命令模式但如果正在编辑可能中断宏或命令谨慎用。如果屏幕底部有个:后跟着命令不想执行就删掉或者按Esc取消。如果屏幕显示Record宏名之类的再按q结束录制。如果完全是乱的按q!并直接回车强制退出不保存重新打开文件再来一次比在混乱状态里硬编安全得多。我见过有人把vi的文件内容改得一团糟不知道是误按了什么替换命令想撤销又撤销不动最后直接q!退出重来。真相是如果做过比较多步骤的修改u只能一步一步撤销远不如接受损失重来一次干净。所以重要文件修改前先cp备份是好习惯。7.5 面试题速查有哪些高频考点vi在Linux面试题中出现的频率非常高整理几个常见考点vi有哪几种模式怎么切换怎么在vi里查找和替换字符串如何撤销操作如何恢复撤销如何跳到文件的第N行:N底行定位或者NG怎么把文件另存为:w 新文件名一个文件被编辑到一半断线了怎么恢复swap文件如何在vi中删除从当前行到文件末尾的所有内容:.,$d面试不一定要考到特别难的操作主要看基础掌握程度三板斧模式切换、保存退出、查找替换背熟了就能过。但如果面试时用vi写个脚本把行号、搜索、替换、寄存器这些实际操作拿出来就能明显和其他候选人拉开差距。建议自己在开发机上用真实文件把文章里的操作练两遍肌肉记忆才是面试能发挥出来的底气。8. 编辑技巧的迁移与扩展vim的强大不仅在于内置命令还在于它是一套可扩展的基础工具。学完vi基础后很多人会沿着两条路线深入一是学习vim的插件体系比如Vundle或vim-plug管理插件、coc.nvim做代码补全、NERDTree做文件树、fzf做模糊查找、vim-airline做状态栏美化二是把vi的按键习惯迁移到其他工具最典型的就是浏览器里用Vimium插件让网页也能用vi风格快捷键操作以及IDE里装vim模拟插件比如VSCode的VSCodeVim、JetBrains的IdeaVim。我的建议是先把原生vi操作练扎实再去碰插件。插件能提升体验但不能替代基础能力。你总会遇到一台机器既没有插件也没有高配vim甚至没有vim只有vi到那时候脑子里存着的命令和手指上的肌肉记忆才是真正的生产力工具。vimrc配置文件的颗粒度也可以根据自己的习惯慢慢调整。比如经常写Python的人单独把缩进设成4空格并加set autoindent经常写Shell脚本的人可能想关掉语法高亮或者换成更适合自己的配色。配置是个人化的参考别人的dotfiles项目可以但先理解每行配置的含义再决定要不要用光抄配置而不懂配置出了问题很难排查。最后说一个可以立刻做的事打开终端敲vi --version或者vim --version看看你的环境支持哪些特性然后新建一个临时文件把文中的命令从1到7过一遍。别看直接上手敲。你会发现自己比想象中更快适应vi的节奏。实际用vi的时间越长越能体会到一个道理工具的价值不在于它有多酷而在于它是否有足够深的底线。很多编辑器在图形界面时代被吹得天花乱坠真正到了生产现场、SSH窗口、纯文本环境能稳定输出的还是那些最朴素的功能。vi是一个难学但值得学的典型初期的挫败感换来的是未来无数场景下的从容这笔账怎么算都不亏。
返回列表